下面是使用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;
}
任何帮助将不胜感激!
答案 0 :(得分:1)
这个想法是两个指针以不同的速度移动。因此,next
的{{1}}可能会跳一个元素,而tortoise
的{{1}}(我认为通常称为 hare )可能会跳更多。
如果将它们都增加,并且存在一个循环,那么某个循环将在某个时候赶上另一个循环。
答案 1 :(得分:1)
让我们在您发布的代码之前查看第一部分。
考虑
快速覆盖距离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(给定的野兔的速度是乌龟的两倍),然后从起点移动一个指针,从第一个交汇点将一个指针移到相交点(即环)。