我想知道是否有人可以解释使用'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;
}
}
答案 0 :(得分:0)
如果没有“上一个”,链表清单链如何保持连接?
想象一下:Prev->Current->Next
如果要从列表中删除Prev->Next
项,则需要将其转换为Current
。如果暂时未保存Prev
,则无法更改它以更新链接。 (如果列表是双向链表,则不需要Prev
,因为它可以从Current->previous
恢复。
快乐的编码。
回应评论中的问题:
如果不执行任何操作,则重复项目不会与列表断开连接。 n = n.next
更改n
的值(但不会更改n
或其他地方存储的元素/节点的数据,因此Prev.next
永远不会更改Current
)。
需要要做的是next
的 Prev
,删除元素之前的元素/节点必须更新为引用已删除元素后的元素(Next
)。
previous.next = n.next; // and this does it
(这也可以用功能性非变异样式编写,其中原始列表未被修改,并且构建了新列表 - 在这种情况下,不需要Prev
)。
答案 1 :(得分:0)
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;
}
}
}