破解编码访谈循环链表

时间:2015-07-20 23:32:36

标签: java linked-list circular-list

问题: 给定循环链表,实现一个在循环开始时返回节点的算法。

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

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

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

1 个答案:

答案 0 :(得分:2)

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