关于删除链表中的循环逻辑的问题

时间:2019-10-03 10:29:14

标签: java algorithm floyd-cycle-finding

下面是使用Floyd的慢速快速算法发现列表中存在循环之后的代码。

我们如何确定循环开始时乌龟和乌龟会合?

Node begin = head;
tortoise = tortoise.next;
while (begin != tortoise) {
    begin = begin.next;
    if (tortoise.next == begin) {        // Find the position of the loop and mark the node as null

        tortoise.next = null;
        return;
    }
    tortoise = tortoise.next;
}

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

这个想法是两个指针以不同的速度移动。因此,next的{​​{1}}可能会跳一个元素,而tortoise的{​​{1}}(我认为通常称为 hare )可能会跳更多。 如果将它们都增加,并且存在一个循环,那么某个循环将在某个时候赶上另一个循环。

答案 1 :(得分:1)

Diagram for reference

让我们在您发布的代码之前查看第一部分。

考虑

  • 慢速(乌龟)和快速指针(野兔)。快速指针移动两次 慢速指针的速度,所以当慢速指针移动了距离“ d”时,快速指针移动了 距离“ 2d”。
  • 从起点到交叉点的长度是x(请参阅图)。
  • 它们在相交点的长度为y的随机点处相遇(请参见图)。
  • 从会合点到相交点,将长度设为z(请参见图)。
  • 循环的长度是y + z;
  • 慢速和快速相遇时。慢已覆盖距离x + y (说d)
  • 快速覆盖距离x + y + z + y (将为2 * d)

  • 2 * d = x + 2y + z

  • 2(x + y)= x + 2y + z

  • 2x + 2y = x + 2y + z

  • x = z(已证明)

现在进入您发布的代码。

因为已经证明x在第一个交汇点之后等于z(给定的野兔的速度是乌龟的两倍),然后从起点移动一个指针,从第一个交汇点将一个指针移到相交点(即环)。