【发布时间】: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