9.2链表(六)——给定一个有环链表,实现一个算法返回环路的开头结点

/**
 * 功能:给定一个有环链表,实现一个算法返回环路的开头结点。
 */

      /**
       * 思路:fast的移动速度是slow的两倍。当slow走了k个结点进入环路,fast已经进入环路k个结点,即fast和slow
       * 相距loop_size -k个结点。
       *          再走loop_ -k次后,碰撞,此时距离环路起始处k个结点。
       *          链表首部与环路起始处均距离环路起始处k个结点。因此,保持其中一个不变,另一个指向链表首部,相会处
       *    即为环路起始处。
       *
       * 算法:
       * 1)创建两个指针,fast和slow。
       * 2)slow每走一步,fast走两步。
       * 3)碰撞时,将slow指向head,fast保持不变。
       * 4)相同速度移动fast和slow,一次一步,返回碰撞结点。
       * @param head
       * @return
       */
      public static LinkedListNode findBeginging(LinkedListNode head){
            LinkedListNode slow= head;
            LinkedListNode fast= head;
            
             while( fast!= null&& fast. next!= null){
                   slow= slow. next;
                   fast= fast. next. next;
                   if( slow!= fast)
                         break;
            }
            
             if( fast== null|| fast. next== null)
                   return null;
            
             slow= head;
             while( slow!= fast){
                   slow= slow. next;
                   fast= fast. next;
            }
            
             return fast;
      }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值