数据结构---判断链表是否有环,返回环的结点

mac2026-01-09  8

判断一个链表是否有环,直接使用两个指针,一个一次走一步,一个一次两步,然后往后面开始遍历,如果相遇的话,就肯定有环。

int SListHasCycle(SList* plist) { SListNode * fast = plist->_head; SListNode * slow = plist->_head; while (slow && fast && fast->_next) { slow = slow->_next; fast = fast->_next->_next; if (slow == fast) { return 1; } return 0; } }

返回环的结点位置:一个指针从相遇点开始跑,一个指针从起点开始跑,相等之后就找到了(相当于分叉链表的交点) 然后返回这个结点,没找到就返回空

SListNode* detectCycle(SList * plist)//找到链表中的入链结点并且返回结点 { SListNode * tmp = SListGetCycle(plist);//找环 if (tmp) { return NULL; } //一个指针从相遇点开始跑,一个指针从起点开始跑,相等之后就找到了(相当于分叉链表的交点) //然后返回这个结点,没找到就返回空 SListNode * cur = plist->_head; for (; cur; cur = cur->_next, tmp = tmp->_next) { if (cur == tmp) { return cur; } } return NULL; }
最新回复(0)