从Cracking the Coding Interview中删除列表中的重复项

时间:2014-11-28 02:05:19

标签: java linked-list

从破解编码面试。 问题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也不是更好吗? 我认为你不需要钥匙和价值。我想你只需要钥匙,对吧?

谢谢

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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