环的入口结点检测

在上述“单链表环的检测”文章中提了两种不同写法的快慢指针(思想是一样的),只是快慢指针初始位置有所不同,进而造成快慢指针相遇结点不同。这有什么影响呢?

这回直接影响对“环入口结点检测”,因为环的入口检测与快慢指针相遇结点息息相关。 只有当快慢指针同时出发时,相遇结点对环的入口结点检测有帮助。

一个指向头结点的指针与慢指针(指向相遇结点)同时出发,第一次相遇的结点为环的入口结点。详细的推导请见诚实的偷包贼的博客: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;
 }
  
  }


}


运行结果为:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值