【问题标题】:Logic behind the method to identify cycle in a linked list识别链表中循环的方法背后的逻辑
【发布时间】:2012-01-04 12:47:12
【问题描述】:

在链表中检测循环的最佳方法是:

  1. 使用 Floyd 的循环查找算法并在链表中识别循环中的位置。
  2. 统计链表中循环的大小
  3. 将一个指针定位在列表的开头,另一个“k”(其中 k 是循环的大小)定位。
  4. 在迭代过程中,它们在循环开始时相遇。

我想知道为什么会这样。这背后的一些理论逻辑?

【问题讨论】:

  • 也许您在描述中混用了“循环”和“链表”?
  • 通常,“循环”是指迭代的构造,而您似乎关心链表中的“循环”。让你知道。
  • 是的。我的意思是循环。感谢澄清
  • 这似乎很明显 - 如果不清楚,也许可以画一个图表?
  • 我知道它有效。我只是不清楚它是如何到达的

标签: algorithm linked-list floyd-cycle-finding


【解决方案1】:

Floyd 方法可以帮助您检测到有一个循环,但由于循环开始之前可能存在一些节点,它不能直接给您循环的长度。所以你应该在下一步计算长度。 现在我们要找出循环的起点。考虑,循环的长度是K,从头节点到循环开始的节点数是L,现在如果你向前移动两个指针,它们会在循环的开始处相遇,因为头指针必须向前L 节点和K 前进的指针有两种可能。它肯定会在L 节点之后的循环开始,因为: 选择1:如果它在循环中,它在循环的节点K-LK-(K-L) = L 上。选择 2:如果超出循环,L-K 节点将保留到开始,L-K + K = L

【讨论】:

  • K-(K-L) = L 表示什么?
  • @Aks 当循环长度为K 并且您在节点K-L 上时,前面有L 节点到达循环开始(与从头开始的节点完全相同)链表)。
  • 您是如何得知该节点位于周期的K-L 上的事实
  • @Aks 第 3 部分说指针在 K 位置之外,所以如果我们假设从头到尾有 L 个节点,则指针在节点 K-L (@987654338 @ 来自K 的节点用于到达循环的开始)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2020-02-01
  • 2017-05-07
相关资源
最近更新 更多