
思路:
1.首先定义一个快指针和慢指针,慢指针走一步,快指针走两步。
2.无环:当slow或者fast等于空或者slow->为空时,返回空,或者fast走到链表末端时为空。
3.有环:当fast与slow第一次相遇时,fast指向头结点,然后slow慢指针走一步,fast走一步,再次相遇时就可返回环节点。
详细讲解:

上代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode *low=pHead;
ListNode *fast=pHead;
while(fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
low=low->next;
if(fast==low)
{
while(pHead!=low)
{
pHead=pHead->next;
low=low->next;
}
return low;
}
}
return NULL;
}
};
本文详细介绍了如何使用快慢指针法检测链表中是否存在环,并在存在环的情况下找到环的入口节点。通过设置快指针每次前进两步,慢指针每次前进一步,当两者相遇时确定链表有环。之后,慢指针回到头节点,继续同步向前直到再次相遇,相遇点即为环的入口节点。提供的C++代码实现了这一算法。
1235

被折叠的 条评论
为什么被折叠?



