从破解编码面试。 问题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也不是更好吗? 我认为你不需要钥匙和价值。我想你只需要钥匙,对吧?
谢谢
答案 0 :(得分:1)
首先,正如评论中已经提到的那样,更改本地参数对调用者输入变量没有影响。
其次,你是对的,使用Set会更好,但只是因为代码更好阅读。代码在语法上是正确的,在内部,Set只不过是具有相同的Map
dummyobject作为每个键的值。
答案 1 :(得分:0)
该函数中没有return语句,因为它被设置为void。 但是,如果列表的头部在某个变量中保留在函数之外,则足以返回正确的结果。 那是因为第一个节点将不会被删除,因为此时不会有任何重复。 毕竟,更改n值没有任何问题。