来自破解编码面试。问题 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 会更好,但这只是因为代码更好读。代码在语法上是正确的,在内部,集合只不过是具有相同内容的映射虚拟对象作为每个键的值。
函数中没有 return 语句,因为它被设置为 void。但是,如果列表的头部在某个变量中保留在函数之外,则返回正确的结果就足够了。这是因为第一个节点不会被删除,因为此时不会有任何重复项。毕竟,更改 n 值没有任何问题。