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

时间:2011-05-04 03:29:52

标签: list linked-list duplicates hashtable

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

2 个答案:

答案 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;
        }
    }
}