【发布时间】:2015-12-06 06:24:39
【问题描述】:
问题陈述:给定一个循环链表,实现一个返回循环开始节点的算法。
答案提供了一个比我建议的更复杂的解决方案。我的怎么了?:
public static Node loopDetection(Node n1) {
ArrayList<Node> nodeStorage = new ArrayList<Node>();
while (n1.next != null) {
nodeStorage.add(n1);
if (nodeStorage.contains(n1.next)) {
return n1;
}
else {
n1 = n1.next;
}
}
return null;
}
【问题讨论】:
-
我很困惑。在循环链表中,您将保留对列表“头”的引用,并且头是循环中的“第一个”节点,因此它位于循环的开头,因此
return head( O(1))。或者,如果您唯一的参考是列表的“尾部”,则头部位于“tail.next”,同样是一个简单的返回语句。 -
@Andreas:考虑一个列表 A->B->C->D->E->C->D->E->... 循环的开始在 C,不是 A。带有循环的链表没有尾巴。想象一下在没有任何出口的单向道路上行驶到环形交叉路口。
-
@gnasher729 circular linked list 与一个 corrupt 非圆形(又名开放或线性)之间存在差异,其中最后一个节点指向第一个节点带有循环的链表。我现在可以看到,问题实际上不是关于 circular 链表,而是关于 corrupt 线性链表,因此我最初的困惑。 “问题陈述”措辞不当。
标签: java algorithm linked-list big-o time-complexity