有环单向链表

1. 给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点。

    判断单向链表是否有环,可以采用快指针与慢指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个节点。在fast与slow第一次相遇后,设置一个节点pNode从链表的头部开始遍历,每次只遍历一个节点。这样,当fast与slow再次相遇时,pNode所处的位置便是环的首部。
其实很简单,想象一下在跑道上跑步:两个速度不同的人在操场跑道上一圈一圈地跑,他们总会有相遇的时候。因此我们只需要准备两个指针,同时从链表头出发,一个每次往前走一步,另一个每次往前走两步。如果链表没有环,那么经过一段时间,第二个(速度较快的)指针就会到达终点;但如果链表中有环,两个指针就会在环里转圈,并会在某个时刻相遇。

[cpp]  view plain copy
  1. LNode* GetLoopNode(LNode* head)  
  2. {  
  3.     //前置条件的判断  
  4.     if (!head)  
  5.     {  
  6.         return NULL;  
  7.     }  
  8.   
  9.     //定义一个快指针和一个慢指针  
  10.     LNode* fast = head;  
  11.     LNode* slow = head;  
  12.     while (fast && (fast->next))  
  13.     {  
  14.         fast = fast->next->next;  
  15.         slow = slow->next;  
  16.   
  17.         if (fast == slow)  
  18.         {  
  19.             //如果有环,则返回环的第一个节点  
  20.             slow = head;  
  21.             while (1)  
  22.             {  
  23.                 fast = fast->next;  
  24.                 slow = slow->next;  
  25.   
  26.                 if (fast == slow)  
  27.                 {  
  28.                     break;  
  29.                 }  
  30.             }  
  31.   
  32.             return slow;  
  33.         }  
  34.     }  
  35.   
  36.     return NULL;  
  37. }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值