Зачем сохранять «предыдущий» при удалении дубликатов в связанном списке? - PullRequest
1 голос
/ 04 мая 2011

Мне было интересно, может кто-нибудь объяснить, для чего используется переменная '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 голосов
/ 04 апреля 2013
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;
        }
    }
}   
0 голосов
/ 04 мая 2011

Без "предыдущего", как цепочка минусов связного списка останется подключенной?

Представьте себе: 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).

...