【问题标题】:Why keep 'previous' while deleting duplicates in linked list?为什么在删除链表中的重复项时保留“上一个”?
【发布时间】:2011-08-18 04:52:16
【问题描述】:

我想知道是否有人可以解释使用“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链如何保持连接?

标签: list linked-list duplicates hashtable


【解决方案1】:

如果没有“previous”,链表 cons 链如何保持连接?

想象一下:如果要从列表中删除 Current 项,则需要将 Prev->Current->Next 转换为 Prev->Next。如果Prev 没有临时保存,那么它就不能被变异来更新链接。 (如果列表是双向链表,则不需要Prev,因为它可以从Current->previous 恢复)。

编码愉快。


回答评论中的问题:

如果什么都不做,则重复项不会与列表断开连接。 n = n.next 更改 n 的值(但不会更改存储在 n 或其他位置的元素/节点的数据,因此 Prev.next 永远不会从 Current 更改)。

需要做的是Prevnext,删除元素之前的元素/节点,必须更新引用该元素(Next) 在被删除的元素之后。

previous.next = n.next; // and this does it

(这也可以写成一个功能性的非可变风格,其中原始列表不被修改并构建一个新列表——在这种情况下,就不需要Prev)。

【讨论】:

  • 删除不就是跳过了重复的元素吗?如果是这样,那么在 'if' 语句中,你就不能……什么都不做吗?然后在 while 循环结束时,它会将 n 递增 n = n.next 那么它现在查看下一个元素?
【解决方案2】:
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;
        }
    }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2021-03-20
    • 2019-06-02
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多