思路:
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;
}
};