【问题标题】:Linked list loop detection链表循环检测
【发布时间】:2016-06-06 07:27:41
【问题描述】:

我们如何证明快速和慢速指针(从一开始)移动 1 使得那里的交汇点成为循环节点?我的意思是我无法理解是什么给了它一个保证的解决方案,即会议节点是循环节点(即节点循环从哪里开始)
我对龟兔循环检测很清楚,基本上我说的是在检测到循环后检测循环开始的节点。

【问题讨论】:

  • 这是tortoise and hare检测方法。
  • 据我所知,不能保证你们会在 cycle 开始的节点相遇。然而,tortoise and hare 方法保证你会在一个节点相遇

标签: algorithm data-structures linked-list


【解决方案1】:

这确实是一个非常简单的证明。首先,您证明慢速指针最多在 n + k 步后会匹配快速指针,其中 n 是到循环开始的链接数,k 是循环的长度。然后你证明它们会在恰好 k 个进一步的步骤后再次匹配。

他们相遇的点将是循环中的任何地方

【讨论】:

    【解决方案2】:

    在尝试正式证明这一点之前,您应该先看一个示例,以便更直观地了解并可视化正在发生的事情。假设您有以下链表,其中 3(在索引 3 处)指向 1(在索引 1 处):

    [0| ]->[1| ]->[2| ]->[3| ]--+
             ^                  |
             |                  |
             |                  |
             +------------------+
    

    遍历逻辑级数,当慢加一个位置,快加两个位置时,您可以观察到以下情况:

    1. 慢 = 索引 0;快速 = 索引 0
    2. 慢 = 索引 1;快速 = 索引 2
    3. 慢 = 索引 2;快速 = 索引 1
    4. 慢 = 索引 3;快速 = 索引 3(存在循环)

    希望这会有所帮助!

    【讨论】:

    • 仍然找不到背后的数学证明。
    猜你喜欢
    • 2012-06-18
    • 2011-12-04
    • 2011-11-15
    • 1970-01-01
    • 2012-01-06
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多