2017-10-07 3 views
0

Je n'arrive pas à comprendre comment cette méthode ci-dessous supprime les doublons dans la liste chaînée. Après avoir appelé cette méthode, tous les doublons ont été supprimés avec succès. Pourquoi la tête n'est pas nulle? N'est-ce pas que le noeud principal est nul, car la variable courante dans la méthode est répétée jusqu'à la fin. Comment cette méthode met-elle à jour la liste pour se débarrasser des éléments en double?Liste liée supprimant les doublons de la liste, confusion de référence

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

Si un utilisateur a répondu à votre question, veuillez également accepter sa réponse ([Accepter les réponses: Comment ça fonctionne?] (Https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- travail)). Si ce n'est pas le cas, veuillez préciser ce qui reste sans réponse, c'est une partie très importante de StackOverflow, merci beaucoup. – Zabuza

Répondre

0

éléments supprimeront en changeant le pointeur de l'élément précédent pour pointer vers le élément suivant. C'est ainsi que vous supprimez les éléments dans LinkedList s, en les ignorant. Le garbage collector enlèvera plus tard l'objet car plus aucun objet n'y fait référence.

Voici une illustration de l'enlèvement:

Illustration


sont Doublons identifiés par la mémorisation de chaque valeur rencontrée dans un HashSet. Si vous trouvez un élément qui était déjà rencontré avant (c'est-à-dire contenu dans l'ensemble), il s'agit d'un en double.


Le head ne peut pas obtenir null parce qu'il n'a pas été null auparavant et les doublons ne peut se produire après le premier élément, puisque vous devez rencontrer un élément au moins une fois jusqu'à ce que vous pouvez trouver un doublon. Par exemple, une liste comme [1, 1, 1] est modifiée en [1] et non en [].

De même, la variable head ne change pas dans la méthode, elle pointe vers le noeud-tête avant et après la méthode. Il semble que vous avez été confondu par current = head mais vous devez savoir que cela, en Java, ne pas synchroniser les deux variables. Si la méthode change current, ces modifications sont et non reflétée par head. La déclaration signifie simplement 'let current point où head points' et ensuite vous laissez current point ailleurs.

+0

Je comprends cela. Cependant, ce qui me pose problème, c'est 'node current = head '. Dans la boucle while, nous itérons jusqu'à ce que le courant soit nul. Ne serait-il pas aussi nul à la fin de la boucle? – Person

+0

'current == null' signifie que nous avons atteint la fin de la liste, la ** queue **. 'current = head' signifie que nous commençons à la tête. Il ne lie pas 'head' à' current' de telle sorte que les changements sur 'current' affectent aussi' head'. 'head' lui-même ne sera jamais' null' par cette méthode puisqu'il ne peut pas être un doublon, les doublons ne peuvent se produire qu'après le premier élément (qui est 'head'). Une liste comme '[1, 1, 1, 1]' ressemblera à '[1]' après la méthode, pas '[]'. – Zabuza

+0

Pourquoi les votes négatifs? – Zabuza