2017-10-07 1 views
0

Ich habe Probleme zu verstehen, wie diese Methode unten die Duplikate in der verknüpften Liste entfernt. Nach dem Aufruf dieser Methode werden alle Duplikate erfolgreich entfernt. Warum ist der Kopf nicht null? Wäre der Kopfknoten nicht null, weil die aktuelle Variable in der Methode bis zum Ende durchlaufen würde. Wie aktualisiert diese Methode die Liste erfolgreich, um die doppelten Elemente zu entfernen?Verknüpfte Liste Entfernen von Duplikat aus der Liste, Referenz Verwirrung

static void removeDuplicate(node head) 
{ 
    // Hash to store seen values 
    HashSet<Integer> hs = new HashSet<>(); 

    node current = head; 
    node prev = null; 
    while (current != null) 
    { 
     int curval = current.val; 

     // If current value is seen before 
     if (hs.contains(curval)) { 
      prev.next = current.next; 
     } else { 
      hs.add(curval); 
      prev = current; 
     } 
     current = current.next; 
    } 

} 
+0

Wenn ein Benutzer Ihre Frage beantwortet, akzeptieren Sie auch seine Antwort ([Antworten annehmen: Wie funktioniert es?] (Https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- Arbeit)). Wenn nicht, geben Sie bitte an, was unbeantwortet bleibt, dies ist ein sehr wichtiger Teil von StackOverflow, vielen Dank. – Zabuza

Antwort

0

Elemente erhalten durch Ändern des Zeigers aus dem vorhergehenden Elemente entfernt zum nächsten Elemente zu verweisen. So entfernen Sie Elemente in LinkedList s, indem Sie sie überspringen. Der Garbage Collector wird später das Objekt entfernen, da kein Objekt mehr darauf verweist. Hier

ist eine Darstellung der Entfernung:

Illustration


Dubletten identifiziert, indem jeder Wert in einem angetroffen HashSet Auswendiglernen. Wenn Sie ein Element finden, das bereits vor vorlag (d. H. In dem Satz enthalten ist), ist es ein Duplikat.


Die head kann nicht null bekommen, weil es nicht null vorher war und Duplikate nur nach dem ersten Elemente auftreten können, da Sie ein Element mindestens einmal begegnen müssen, bis Sie ein Duplikat finden. Zum Beispiel wird eine Liste wie [1, 1, 1] zu [1] geändert und nicht zu [].

Auch die Variable head wird in der Methode nicht geändert, sie zeigt auf den Kopfknoten vor und nach der Methode. Es scheint, dass Sie von current = head verwirrt wurden, aber Sie müssen wissen, dass dies in Java nicht beide Variablen synchronisiert. Ändert sich die Methode current, sind diese Änderungen nicht, die von head wiedergegeben werden. Die Aussage bedeutet nur "lassen current zeigen, wo head Punkte" und anschließend lassen Sie current zeigen Sie woanders.

+0

Ich verstehe das. Was es jedoch mit dem Problem zu tun hat, ist "Knotenstrom = Kopf". In der while-Schleife durchlaufen wir solange, bis der aktuelle Wert null ist. Würde der Kopf auch am Ende der Schleife null sein? – Person

+0

'current == null' bedeutet, dass wir das Ende der Liste erreicht haben, den ** Schwanz **. 'current = head' bedeutet, wir fangen am Kopf an. Es verbindet "head" nicht mit "current", so dass Änderungen an "current" auch "head" betreffen. 'head' selbst wird niemals' null' sein, da es kein Duplikat sein kann, Duplikate können nur nach dem ersten Element (was 'head' ist) vorkommen. Eine Liste wie '[1, 1, 1, 1]' sieht nach der Methode wie '[1] 'aus, nicht' [] '. – Zabuza

+0

Warum die Herabstufungen? – Zabuza