zoukankan      html  css  js  c++  java
  • 判断一个单链表是否有环

    Given a circular linked list, implement an algorithm which returns node at the beginning of the loop.

    DEFINITION

    Circular linked list: A (corrupt) linked list in which a node’s next pointer points to an earlier node, so as to make a loop in the linked list.
    
    EXAMPLE Input: A -> B -> C -> D -> E -> C [the same C as earlier] Output: C

     

     

    If we move two pointers, one with speed 1 and another with speed 2, they will end up meeting if the linked list has a loop. Why? Think about two cars driving on a track—the faster car will always pass the slower one!


    The tricky part here is finding the start of the loop. Imagine, as an analogy, two people racing around a track, one running twice as fast as the other. If they start off at the same place, when will they next meet? They will next meet at the start of the next lap.
    Now, let’s suppose Fast Runner had a head start of k meters on an n step lap. When will they next meet? They will meet k meters before the start of the next lap. (Why? Fast Runner would have made k+2(n - k) -k steps, including its head start, and Slow Runner would have made n - k steps. Both will be k steps before the start of the loop.)


    Now, going back to the problem, when Fast Runner (n2) and Slow Runner (n1) are moving around our circular linked list, n2 will have a head start on the loop when n1 enters. Specifically, it will have a head start of k, where k is the number of nodes before the loop. Since n2 has a head start of k nodes, n1 and n2 will meet k nodes before the start of the loop.


    So, we now know the following:
    1. Head is k nodes from LoopStart (by definition).
    2. MeetingPoint for n1 and n2 is k nodes from LoopStart (as shown above).

    Thus, if we move n1 back to Head and keep n2 at MeetingPoint, and move them both at the same pace, they will meet at LoopStart.

     

     

     

  • 相关阅读:
    面向对象-继承
    antd pro2.0 使用记录一:登录/注册/底部版权等设置
    vscode中git的配置
    电脑桌面文件夹出现在屏幕之外了,怎么解决
    百度网盘不限速-Motrix
    u盘在电脑读不出来,但别的可以读
    win10 命令重置 管理员密码
    nginx 配置
    react 记录:运行npm run eject命令暴露配置文件都报这个错误
    浏览器 连不上网 (3):DNS 服务器问题
  • 原文地址:https://www.cnblogs.com/kaleidoscope/p/9494869.html
Copyright © 2011-2022 走看看