繁体   English   中英

希望了解在单链表中查找循环起点的算法

[英]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步返回到循环的起点。

让我知道是否有帮助。

  1. 取2个指针(f和s)。
  2. 从“链接”列表头开始两个指针。 使f(更快)以s(慢)的速度两倍移动,即f跳两次,s跳一次。
  3. 检查他们是否见面。
  4. 如果它们相遇,则使s指向链接列表的开头,并且不要更改f的值(因为f现在指向其会议节点)
  5. 现在使两个指针速度相等,并使它们仅移动一个节点。
  6. 他们会面的地方将是循环的起点。 (要获得此效果,只需绘制一个图表或了解以上内容即可。

让我知道你是否愿意得到这个。 乐意为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM