我想知道是否有人可以解释使用'LinkedListNode previous'变量的目的是什么。我理解试图删除副本的大意。您遍历链表,如果值不在散列表中,则插入它。但如果是,它在做什么?我不太确定。
谢谢你的帮助!如果有人能以一种清晰易懂的方式解释一下,我将不胜感激。谢谢!
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;
}
}
如果没有"previous",链表cons链如何保持连接?
想象:如果要从列表中删除Current
项,则需要将Prev->Current->Next
变为Prev->Next
。如果Prev
没有被暂时保存,那么它就不能被突变来更新链接。(如果列表是一个双链表,那么Prev
就不需要了,因为它可以从Current->previous
恢复)。
幸福的编码。
回复评论中的问题:
如果什么都不做,则重复项不从列表中断开。n = n.next
改变了n
的值(但不改变存储在n
或其他地方的元素/节点的数据,因此Prev.next
永远不会从Current
改变)。
需要做的是Prev
的 next
,即被删除元素之前的元素/节点,必须更新为指向被删除元素之后的元素(Next
)。
previous.next = n.next; // and this does it
Prev
)。public static void deleteDup( LinkedList* h){
if( !h || !h->next )
return;
Hashtable ht = new Hashtable();
LinkedListNode* previous = h;
LinkedListNode* curr = h->next;
while( curr ){
if( ht.containsKey() ){
previous->next = curr->next;
free(curr);
curr = previous->next;
}
else{
ht.put(curr->data, true );
previous = curr;
curr = curr->next;
}
}
}