【问题标题】:Cracking the Coding Interview Circular Linked List [closed]破解编码面试通函链接列表[关闭]
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • +1。我认为您还需要考虑在 ArrayList 中搜索所花费的时间,在最坏的情况下,是 O(n) 本身。
  • 加分。好点子。对于此类问题,我们通常只关注空间复杂度。我们不应该。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2020-09-07
  • 2018-08-12
  • 2013-09-05
  • 2015-12-06
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多