【发布时间】:2016-08-10 08:16:26
【问题描述】:
最近,我已经完成了用于检测循环中第一个节点的算法,如下所述:-
注意:此声明摘自网站:-
http://javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html
现在的重点是,我们将如何知道循环的起始节点。
步骤 1:找到循环后,两个指针都指向在汇合点的公共节点
内循环,
第 2 步:现在,将其中的一个指针(比如乌龟)移动到列表的头部,保持兔子
指针位于与循环内的交汇点相同的位置。
第 3 步: 开始一次将两个指针移动一个节点。他们相遇的地方是开始
循环/循环的节点。
让我们考虑下图中的案例2:-
在应用所有步骤时,在案例 2 中,我陷入了 步骤 3
“以下是兔龟算法针对案例 2 的演算。”
更快 - 1 更慢 - 1
更快 - 5 更慢 - 20
更快 - 22 更慢 - 5
更快 - 20 更慢 - 18
更快 - 18 更慢 - 22
更快 - 1 更慢 - 1 - 两个指针在这里相遇..
因此,按照第 2 步,我将 Faster Pointer 保持原样,并将 Slow Pointer 移动到 1(这是列表的头部)。
因此,按照第 3 步,我将每个指针一一递增。
由于它们都在“1”中,将每个指针移动一个,永远不会结束,它会一直移动。
Q1.请问,我在第 3 步中是否理解错了什么?
Q2.我可以假设循环结束的节点是循环中的第一个节点吗?
【问题讨论】:
-
另见this question。它有很好的图片答案!
标签: algorithm data-structures linked-list