【问题标题】:Why does the fast pointer in loop detection of linked list need to be two steps ahead?为什么链表循环检测中的快速指针需要提前两步?
【发布时间】:2016-11-19 01:37:06
【问题描述】:

在链表中检测循环的大多数解决方案都说快速指针需要移动慢速指针的两倍。为什么我们不能让快速指针领先一步,如果fast.next == slow 我们就完成了。 代码看起来像这样

slow = head;
fast = head.next;

while(fast.next != slow)
{
   slow = slow.next;
   fast = fast.next;
   if(fast == null) /* No loop to begin with, break */
       break;
}

return fast; /* The starting loop node*/

编辑:我的意思是 fast.next != slow

【问题讨论】:

  • 呃,这将如何检测长度大于 2 的循环?
  • 这是什么意思?这种方法可能很幼稚,但它应该有效。快的总是领先的。这里 fast 和 slow 不相交,但 slow.next 必须等于 fast 一个循环。
  • 呃,就目前而言,slow.next总是等于fast,不管有没有循环。说“快总是领先”与说“slow.next 等于快”是一回事。
  • 您的代码不起作用。在第一次迭代“slow.next==fast”,然后你检测到大小为 1 的“循环”(这根本不是一个循环)。通常你需要加速快速指针,所以它会在任何循环长度的情况下获得第一个。此外,请指出前面两站的解决方案...
  • 是的,我画了这个图,意思是slow.next应该等于fast,却没有意识到我开始的条件是fast.next应该等于slow。非常感谢

标签: java linked-list


【解决方案1】:

首先,因为你的指针永远不会相遇,因为快总是先于慢,而指针相遇就是你用来检测循环的东西。

另外,如果你确实有循环,你会陷入无限循环。假设你有

1 -> 2 -> 3 -> 4
     ^_________| 
  1. slow 为 1,fast 为 2
  2. slow 为 2,fast 为 3
  3. slow 为 3,fast 为 4
  4. slow 为 4,fast 为 2
  5. slow 为 2 时,fast 为 3(我们之前一直在这里,无限循环)

【讨论】:

  • 谢谢!不知道我在这里发布这个问题时在想什么。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多