为什么要在删除链表中的重复项时保留'previous'?



我想知道是否有人可以解释使用'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;
        }
    }
}   

相关内容

  • 没有找到相关文章

最新更新