2
votes

Suppression d'un nœud dans une liste doublement liée en Java

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;
}


2 commentaires

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


3 Réponses :


5
votes

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.


0 commentaires

0
votes

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.


0 commentaires

2
votes

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.


0 commentaires