【发布时间】:2015-07-20 23:32:36
【问题描述】:
问题: 给定一个循环链表,实现一个返回循环开始节点的算法。
定义:循环链表:一个(损坏的)链表,其中一个节点的next指针指向更早的节点,从而在链表中形成一个循环。
示例: 输入:A -> B -> C -> D -> E -> C[与之前相同的 C] 输出:C
我的解决方案是跟踪在 ArrayList 中看到哪些节点,然后一旦我到达一个我已经看到的节点,我就知道这是循环开始的节点。
findBeginningLoop 函数:
public Node findBeginningLoop(Node n) {
ArrayList<Node> nodes = new ArrayList<Node>();
Node pointer = n;
while (true) {
Node checkingNode = pointer;
if (!nodes.contains(checkingNode)) {
nodes.add(checkingNode);
} else {
return checkingNode;
}
}
}
节点类:
public class Node {
Node next = null;
int val;
public Node(int d) {
val = d;
}
public void appendToTail(int d) {
Node end = new Node(d);
Node n = this;
while (n.next != null) {
n = n.next;
}
n.next = end;
}
}
她的解决方案是使用快指针和慢指针。那个解决方案更好吗?
【问题讨论】:
-
代码的哪些部分给了你?例如,
public class Node给定了吗?还给了什么? -
我不明白 - 如果它是一个循环,那么就没有开始。只需选择任何节点即可...
-
我猜他们的意思是在他的情况下重新获得节点,例如 C
-
你的空间复杂度是
O(n),比书中的要差很多。无论如何,您很可能会被要求在不使用任何额外数据结构(就地)的情况下实现该解决方案,因此您必须更喜欢书中的解决方案。 -
正确答案是“修复列表实现,使其不会损坏”。 :)
标签: java linked-list circular-list