Java 破解编码采访循环链表

Java 破解编码采访循环链表,java,linked-list,circular-list,Java,Linked List,Circular List,问题是: 给定一个循环链表,实现一个返回循环开头节点的算法 定义:循环链表:一种(损坏的)链表,其中节点的下一个指针指向先前的节点,以便在链表中形成循环 例如: 输入:A->B->C->D->E->C[与前面的C相同] 产出:C 我的解决方案是跟踪在ArrayList中看到的节点,然后一旦到达我已经看到的节点,我就知道那是循环开始处的节点 findBeginningLoop函数: public Node findBeginningLoop(Node n) { ArrayList<N

问题是: 给定一个循环链表,实现一个返回循环开头节点的算法

定义:循环链表:一种(损坏的)链表,其中节点的下一个指针指向先前的节点,以便在链表中形成循环

例如: 输入: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;
        }
    }
}

她的解决方案是使用快速指针和慢速指针。这个解决方案更好吗?

就空间复杂性而言,是的,她的解决方案显然更好。您的解决方案要求您维护已看到的所有节点,即
O(n)
n
是列表的大小。

代码的哪些部分已提供给您?e、 g是
公共类节点
给定的吗?还有什么?我不明白-如果它是一个循环,那么就没有开始。只要选择任何一个节点就可以了……我猜他们的意思是重新选择节点,例如C在他的例子中,你的空间复杂度是
O(n)
,这比书中的要糟糕得多。您很可能会被要求在不使用任何其他数据结构(就地)的情况下实现解决方案,因此您必须更喜欢书中的解决方案。正确答案是“修复列表实现,使其不会损坏”。:)+1。我认为您还需要考虑在
ArrayList
中进行搜索所花费的时间,在最坏的情况下,它本身就是
O(n)
加上。说得好。对于这样的问题,我们通常只关注空间复杂性。我们不应该。
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;
    }   
}