在Cracking the Coding Interview Linked List问题中: 编写代码以从未排序的链表中删除重复项,解决方案是
public static void deleteDups (LinkedListNode n){
Hashtable table = new Hashtable();
LinkedListNode previous = null;
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
不会改变传递给函数的链表,但是previous.next = n.next
和previous = n
是否会改变传入的链表?
答案 0 :(得分:5)
n
是对LinkedListNode
的引用。通过在那里设置不同的值,您不会修改原始LinkedListNode
,只需将引用更改为其他内容即可。换句话说,你在“n”标签下“记住”了一些新内容,但是你没有修改原来的“n”。
X x = new X();
x = new X(); // this does not modify the original x
previous
是LinkedListNode
,通过设置LinkedListNode的值,您正在修改它。
X x = new X();
x.y = new Y(); // this does mofiy the original x
换句话说,您正在设置您记住的值为“previous”的属性。
而且,正如dimo414已经提到的,在这里使用HashTable是一个坏主意。仅使用清晰度就足以成为使用简单(Hash-)集的理由。
答案 1 :(得分:1)
n是指向相关链表节点的指针。
n = n.next
只需将指针移动到下一个节点即可。
previous.next = n.next
更改节点“previous”指向的位置。 previous.next是对象“previous”中包含的值,前一个节点之后的节点。所以previous.next = n.next修改了“previous”节点对象。