2
votes

Java - Suppression d'un élément de LinkedList sauf en premier

Je suis nouveau sur Java.

J'ai créé une méthode dans laquelle il supprimera les éléments de LinkedList à l'exception du premier. L'idée est qu'un booléen sera défini sur true si les données d'élément d'une LinkedList (qui sont en Integer) correspondent au paramètre. Une fois que le booléen est défini sur true, il supprimera tout élément qui correspondait également au premier.

Maintenant, le problème. Par exemple, si je devais supprimer 5 sauf le premier de cette LinkedList:

5 5 5 6 5 7 8 9

J'obtiendrai un résultat comme celui-ci:

5 5 6 7 8 9

Comme vous pouvez le voir, il n'a pas supprimé le 5 en deuxième position. Y a-t-il un problème avec mon code?

Voici le code au fait

public void append(int data) {
    Node newNode = new Node(data);
    if (head == null) {
        head = new Node(data);
        return;
    }

    Node lastNode = head;
    while (lastNode.next != null) {
        lastNode = lastNode.next;
    }

    lastNode.next = newNode;
    return;
}

public void insert(int data) {
    Node newData = new Node(data);
    newData.next = head;
    head = newData;
}

public void removeExceptFirst(int dataValue) { //The mentioned method
    boolean duplicate = false;
    Node currentNode = head;
    while (currentNode.next != null) {
        int value = currentNode.next.data;
        if (value == dataValue) {
            if (!duplicate) {
                duplicate = true;
                currentNode = currentNode.next;
            } else {
                currentNode.next = currentNode.next.next;
            }
        } else {
        currentNode = currentNode.next;
        }
    }
    return;
}


2 commentaires

Si vous essayez d'éviter les doublons, y a-t-il une raison pour laquelle vous ne pouvez pas utiliser LinkedHashSet ?


@ D.B. Cela pourrait fonctionner, mais j'essaie de supprimer les doublons sans utiliser cela


3 Réponses :


0
votes

Vous avez ignoré le nœud principal. Essayez de remplacer

    Node currentNode = new Node();
    currentNode.next = head;

par

    Node currentNode = head;


1 commentaires

Merci! Celui-ci fonctionne très bien. Je crée également une nouvelle LinkedList qui est une version inversée de l'original, et qui fonctionne toujours.



0
votes

Vous devez mettre à jour la référence du nœud actuel et head-> next doit pointer vers le nœud actuel après avoir supprimé le nœud. essayez le code ci-dessous:

if (!duplicate) {
    duplicate = true;
    currentNode = currentNode.next;
     head.next= currentNode.next;
}else {
    currentNode.next = currentNode.next.next;
    currentNode = currentNode.next;
    head.next = currentNode;  }

`


0 commentaires

1
votes

Le problème ici est avec

1. Put the condition outside of the loop to check whether the head element itself is 
   that node, if->yes mark isDuplicate = true and proceed in the loop.
2. Inside the loop check afterward and then assign the next node.

vous marquez duplicate = true et assignez immédiatement le "currentNode = currentNode.next;" en raison de cette référence, le nœud suivant est conservé Donc

if (!duplicate) {
     duplicate = true;
     currentNode = currentNode.next;
} 

J'espère que cela devrait fonctionner


1 commentaires

Cela a fonctionné, mais un autre problème se pose.J'essaie la nouvelle méthode sur la LinkedList inversée, qui est: 9 8 7 5 6 5 5 5. Bien que la LinkedList originale fonctionne correctement, celle inversée avait supprimé tous les 5, ce qui donnait: 9 8 7 6. J'ai essayé la solution de Lauthu et cela a fonctionné