[英]Looking to understand the algorithm to find the start of a loop in a singly linked list
这里是一个非常优雅的解决了这个问题在这里 ,但我不明白的最重要的部分-为什么,移动S回列表开始后,分别为S和F从循环开始相同的距离? 他做了一些数学运算来“证明”它,但是对我来说这没有意义。 任何对更好地理解这一点的帮助将不胜感激。 谢谢!
为了解决这个问题,我们假设存在一个n
节点循环,该循环从起点开始数m
节点开始,并且我们正在使用慢速指针S(每步一个节点)和快速指针F(每步两个节点)进行遍历。 为了简洁起见,我们假设m < n
,但这无关紧要(只需执行一些模块化算术)。
关键是要认识到S和F将在节点n - m
处重叠。 诚然,本文中完成的数学运算有些困难,并且似乎不能推广为奇数n
。 不知道这会容易得多,但我会尝试。
假设S从循环的开始处开始,F从循环的开始处开始k
节点,我们开始遍历循环。 在时间步长x
,S将是循环开始之后的x
节点,F将是循环开始之后的2x + k
节点。 当然,直到F越过循环的开始,F才会超过S,在这一点上,我们可以等效地将其描述为超过开始的(2x + k) - n = 2x - (n - k)
节点。
我们现在问,“ x
和S在哪一步重叠?” 就是说,当S的位置等于F的位置时,因此x = 2x - (n - k)
或(使用一些简单的代数), x = n - k
。 因此,两个指针都将在循环开始之后为n - k
节点。
回到原来的问题(两个指针都从列表的开头开始),到S到达起点(以m
步为单位)时,F将经过2m
步,因此将在循环开始之后m
节点( 2m - m = m
)。 用上面的m
替换k
,我们看到当指针F(和S)是循环开始之后的n - m
节点时,节点将重叠。 因此,如果我们将S返回到起点,则F和S都将花费m
步返回到循环的起点。
让我知道是否有帮助。
让我知道你是否愿意得到这个。 乐意为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.