环入口点:我们设A是链表的起点,B是环的入口点,C是环内快慢指针的相遇点。两个快慢指针定义为slow和fast.
slow走的路程:A->B->C;
fast走的路程:A->B->C->B->C;
2*(x+y)=x+y+z+y =》 x=z;
即A->B的路程等于C->B的路程;
//环的入口点
void FinLoopEntry(List*head)
{
List*fast=head;
List*slow=head;
if(fast==NULL||slow==NULL)
{
return;
}
while(fast!=NULL&&slow!=NULL)//先让快指针走两步,慢指针走一步,直到第一次相遇
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
break;
}
}
slow=head;//第一次相遇后,让slow指针从链表头开始走
while(slow!=fast)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}