题目:一个链表中包含环,请找出该链表的环的入口节。
分析:做此题我们想到一个链表有环,环中有n个节点,这样我们用2个指针分别指向第一个节点和第n+1个节点,同步向后运动,当指向同一个节点的时候就是环的入口节点。当然我们首先要求出链表中环包含几个节点,还是用两个指针,一个运动快,一个运动慢,有环就会相遇。相遇节点必然在环的一个节点,我们从相遇节点开始,循环一周就知道环的节点个数。要做此题共需3个阶段:
1.判断链表中有没有环;
2.求出环中有多少个节点;
3.求出环的入口节点;
程序:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(!pHead) return pHead;
ListNode *p=pHead,*q=pHead->next;
while(p!=q){
if(!p||!q) return NULL;
p=p->next;
q=q->next->next;
}
int i=1;
q=q->next;
while(q!=p) {i++;q=q->next;}
p=pHead;
while(i--) p=p->next;
q=pHead;
while(q!=p){
p=p->next;
q=q->next;
}
return p;
}