【问题标题】:Remove duplicates in list from Cracking the Coding Interview从破解编码面试中删除列表中的重复项
【发布时间】:2014-11-28 02:05:18
【问题描述】:

来自破解编码面试。 问题 2.1:编写代码以从未排序的链表中删除重复项。 这是他们提供的解决方案:

public static void removeDuplicates(Node n) {
    Hashtable<Integer, Boolean> table = new Hashtable<Integer, Boolean>();
    Node previous = n;
    while (n != null) {
    if (table.containsKey(n.data)) {
        previous.next = n.next;
    } else {
        table.put(n.data, true);
        previous = n;
    }
    n = n.next;
    }
}

我的问题是: 当你做 n=n.next 时,你不会丢失链表的头部(第一个节点)吗? 如果您无法访问头部,您将如何在删除重复项后再次访问此列表?

而且使用 Set 代替 Table 不是更好吗? 我认为您不需要 Key 和 Value。我想你只需要钥匙,对吧?

谢谢

【问题讨论】:

  • n 是函数的局部变量。对它的更改不会影响调用函数中的原始变量。
  • 这看起来很糟糕,你确定他们不想欺骗你吗?!

标签: java linked-list


【解决方案1】:

首先,正如评论中已经提到的,本地参数的更改对调用者输入变量没有影响。
其次,您是对的,使用 Set 会更好,但这只是因为代码更易于阅读。代码在语法上是正确的,在内部,一个 Set 只不过是一个具有相同功能的 Map dummyobject 作为每个键的值。

【讨论】:

    【解决方案2】:

    函数中没有return语句,因为它被设置为void。 但是,如果列表的头部保留在函数之外的某个变量中,则返回正确的结果就足够了。 这是因为第一个节点不会被删除,因为此时不会有任何重复。 毕竟,你改变n值没有任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 2014-09-30
      • 2021-04-02
      • 2016-01-28
      相关资源
      最近更新 更多