J'apprends les listes à double lien en Java et j'ai trouvé un tutoriel sur la suppression d'un nœud avec une clé spécifique.
Voici le code:
current.setNext(null); current.setPrevious(null);
Je veux vous demander si ce code est correct. À mon avis, ce n'est pas correct car il doit également faire ceci:
public Node deleteKey(int key) { Node current = first; while (current.getData() != key) { current = current.getNext(); if (current == null) { return null; } } if (current == first) { first = current.getNext(); } else { current.getPrevious().setNext(current.getNext()); } if (current == last) { last = current.getPrevious(); } else { current.getNext().setPrevious(current.getPrevious()); } return current; }
3 Réponses :
L'appel de current.setNext (null)
et current.setPrevious (null)
n'est pas nécessaire, car après avoir appelé deleteKey (int key)
, aucun Node
de la liste ne contiendra une référence au Node
supprimé (référencé par current
), donc peu importe ce que Nœud
est le Node
supprimé auquel fait référence.
Vous n'avez pas besoin de définir le suivant et le précédent du courant de null car le nœud est supprimé de la liste.
N'oubliez pas que la seule façon de parcourir une liste à double chaînage est de commencer au premier nœud ou nœud principal et de continuer jusqu'au nœud requis ou au dernier nœud / queue. Si vous souhaitez supprimer un nœud, il vous suffit de le lier avant son nœud suivant et vice versa.
Cela étant dit, il n'est pas faux de définir le suivant et le précédent du nœud supprimé sur null, car cela vous empêche de parcourir la liste via la référence de ce nœud.
Il n'est pas absolument nécessaire de définir les pointeurs suivant et précédent sur null
, cependant, comme le nœud est renvoyé par la méthode deleteKey
, je suis d'accord avec vous: il serait préférable de les mettre à null
et d'éviter toute fuite de mémoire.
Un autre problème avec ce code est que si la liste était vide, first
serait nul, et l'expression while lancerait un NPE.
Il semble correct (à cette partie). Comme @MauricePerry l'a dit Si la liste est vide, elle échoue.
Cela lèvera une exception si la liste est vide