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; }
3 Réponses :
Vous avez ignoré le nœud principal. Essayez de remplacer
Node currentNode = new Node(); currentNode.next = head;
par
Node currentNode = head;
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.
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; }
`
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
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é
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