【发布时间】:2015-11-26 11:42:27
【问题描述】:
在链表中找到循环的正常情况是移动一个指针一次,移动另一个指针两次。如果它们相遇,则链表中有一个循环。
但是如果我移动第二个指针三四次会发生什么。它会降低复杂度吗?为什么我们只需要移动第二个指针两次。
boolean hasLoop(Node first) {
Node slow, fast;
slow = fast = first;
while(true) {
slow = slow.next;
if(fast.next != null)
fast = fast.next.next;
else
return false;
if(slow == null || fast == null)
return false;
if(slow == fast)
return true;
}
}
为什么我不能有 fast.next.next.next 或 fast.next.next.next.next.next,而不是 fast.next.next?
【问题讨论】:
-
我没有听懂这个问题,你能用代码说明你的意思吗?您是否希望在单链表中找到可能的循环(所有节点都只有指向后续节点的指针)?有一些不同的策略,将其转换为双向链表是一个选项,因为保留反向链接将使查找循环变得基本......如果你从前面遍历它,并找到一个节点反向链接不是您刚刚来自的链接,那么您可以假设两个节点链接到同一事物。关于移动指针,正如我所说,请显示代码...
-
@RichardEriksson 我认为这是一个理解问题,而不是一个实现问题 - 那么为什么加快更快的指针是不切实际的呢?
-
啊。我现在明白是什么问题了。
标签: data-structures linked-list