链表中的循环检测算法如何工作

时间:2015-10-12 20:09:32

标签: algorithm singly-linked-list

我知道可以通过一个慢速和另一个快速使用两个指针来完成。但是我还不清楚,如果有一个循环,那么我们如何确定慢速和快速指针在某一点上重叠。我猜可能有些情况下它们无限循环而没有重叠。两个必须重叠的周期数是否有任何等式或上限。

3 个答案:

答案 0 :(得分:1)

忘记链接列表。并试着假设你和你的伙伴正在圆形赛道上比赛。但他比你快2倍。当你覆盖半圈时,你的好友将完成整个圈子,当你完成第一个圈子时,你的伙伴会比你快2倍。

现在用圆圈替换圆圈,这些圆点代表链表的节点。

但是假设你没有循环列表,那么你的伙伴会更快到达最后一个节点并完成比赛。

答案 1 :(得分:1)

考虑两个指针。 P1和P2。 (乌龟和野兔)

P1  P2  Delta
1   2   1
2   4   2
3   6   3
4   8   4
5   10  5
6   12  6

两步之间的距离增加1。最终(在循环中)他们将会面。

答案 2 :(得分:0)

这个想法是慢速(乌龟)指针在每一步中前进1项,而快速(野兔)指针前进2项。

当野兔非常靠近乌龟(在X处)时,让我们说它是后面的两个项目(X - 2)..下一步:

野兔的位置:X
乌龟位置:X + 1

现在野兔只落后一项,下一步:

野兔位置:X + 2
乌龟位置:X + 2

他们见面了。如您所见,如果它们之间的距离是2个项目,它们最终会相遇,如果距离是1个项目(如下面两个项目后面的步骤),它们将在下一步会面。

兔子总是快一步,所以不能“跳过”。