在上述“单链表环的检测”文章中提了两种不同写法的快慢指针(思想是一样的),只是快慢指针初始位置有所不同,进而造成快慢指针相遇结点不同。这有什么影响呢?
这回直接影响对“环入口结点检测”,因为环的入口检测与快慢指针相遇结点息息相关。 只有当快慢指针同时出发时,相遇结点对环的入口结点检测有帮助。
一个指向头结点的指针与慢指针(指向相遇结点)同时出发,第一次相遇的结点为环的入口结点。详细的推导请见诚实的偷包贼的博客:http://blog.csdn.net/fanfank/article/details/9140849。
本文使用在上文中创建的带环的单链表:
//环的入口检测
pNode CircleStart(pNode head)
{
pNode fast,slow,temp;
fast=slow=temp=head;
if(NULL==head->next)
{
printf("只有一个头结点!");
return NULL;
}
else if(NULL==head->next->next)
{
printf("只有2个结点!");
return NULL;
}
else
{
while((NULL!=fast)&&(NULL!=fast->next))
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
{
break;
}
}
}
//一个指向头结点的指针与慢指针(指向相遇结点)同时出发,相遇的结点为环的入口结点
while(1)
{
temp=temp->next;
slow=slow->next;
if(slow==temp)
{
return slow;
}
}
}
运行结果为: