题目:寻找一个存在环的链表中,环的入口节点。
solution1:第一步,先通过构建快慢指针,判断链表中存在环;第二步,计算环中节点的个数;第三步,找到环的入口节点。
solution2:构建快慢指针,判断存在环,当两个指针相遇时,慢指针的位置不变,构建一个新的指针从头开始走,与慢指针同时向前一次移动一位,相遇的位置即环的入口。
一、判断链表是否有环的代码如下:
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *p1,*p2;
p1=p2=head;
if(head==NULL)
return 0;
do
{
if(!p1||!p2)
return false;
p1=p1->next;
p2=p2->next;
if(!p2)
return 0;
else
p2=p2->next;
}while(p1!=p2);
return 1;
}
};
二、找环的入口节点的代码:
ListNode* FirstNodeofCycle(ListNode *head) {
ListNode *p1,*p2,p3;
p1=p2=p3=head;
if(head==NULL)
return NULL;
do
{
if(!p1||!p2)
return NULL;
p1=p1->next;
p2=p2->next;
if(!p2)
return NULL;
else
p2=p2->next;
}while(p1!=p2);
while(p1!=p3)
{
p3=p3->next;
p1=p1->next;
}
return p1;
}