一尘不染

在链表中检测到循环开始的证明

algorithm

这是再次提供参考的步骤。

检测循环:

有两个指针,通常称为野兔和乌龟。将野兔移动2步,将乌龟移动1。如果它们在某个点相遇,则肯定存在一个循环,并且相遇点显然在循环内。

查找循环长度:

保持一个指针固定在会合点上,同时增加另一个指针直到它们再次相同。当您继续前进时增加一个计数器,满足时的计数器值将是周期的长度。

找到周期的开始

用一个指针指向列表的开头,将另一个指针保持在集合点。现在,将两者都增加一个,并且相遇点就是循环的开始。我在纸上用一些案例验证了该方法,但我不明白为什么它应该起作用。

有人可以提供数学证明此方法为何有效吗?


阅读 254

收藏
2020-07-28

共1个答案

一尘不染

如果不使用集合点,则可以使“查找周期的开始”证明更加简单。
让第二个指针不在“会合点”处开始,而是M在第一个指针之前。(M循环的长度在哪里。)

这样,证明就很明显了。当第一个指针到达循环的起点时,第二个指针将恰好M向前:在循环的起点。

2020-07-28