Liste Liée Méthode Delete
Voici une définition de classe pour ma Liste Liée. Je lance un programme de test qui crée un nouveau LinkedList et insère le nombre "3, 2, 1", puis imprime la liste. Cela fonctionne très bien. Cependant, lorsque j'essaie de le supprimer "3" ou "2," la méthode delete ne se termine jamais. Quand j'essaie de le supprimer "1", il se contente d'afficher la liste complète comme si rien n'avait été supprimé.
public class LinkedListTest implements LinkedList {
private Node head;
public LinkedListTest(){
head = new Node();
}
public void insert(Object x){
if (lookup(x).equals(false)){
if (head.data == null)
head.data = x;
else{
//InsertLast
Node temp = head;
while (temp.next != null){
temp = temp.next;
}
Node NewNode = new Node();
NewNode.data = x;
NewNode.next = null;
temp.next = NewNode;
}
}
//Runtime of insert method will be n, where n is the number of nodes
}
public void delete(Object x){
if (lookup(x).equals(true)){
if (head.data == x)
head = head.next;
else{
Node temp = head;
while (temp.next != null){
if ((temp.next).data == x)
temp.next = (temp.next).next;
else
temp = temp.next;
}
}
}
}
public Object lookup(Object x){
Node temp = head;
Boolean search = false;
if (head.data == x)
search = true;
while (temp.next != null){
if (temp.data == x){
search = true;
}
else{
temp = temp.next;
}
}
return search;
}
public boolean isEmpty(){
if (head.next == null && head.data == null)
return true;
else
return false;
}
public void printList(){
Node temp = head;
System.out.print(temp.data + " ");
while (temp.next != null){
temp = temp.next;
System.out.print(temp.data + " ");
}
}
}
EDIT: Voici le nœud de classe:
public class Node {
public Object data;
public Node next;
public Node(){
this.data = null;
this.next = null;
}
}
InformationsquelleAutor Christian Baker | 2014-02-15
Vous devez vous connecter pour publier un commentaire.
Il existe quelques problèmes ici.
Le premier gros problème, c'est que dans votre
lookup()
et votredelete()
méthodes, vous n'avez pas à sortir de votre boucles lorsqu'un problème survient. C'est pourquoi votre programme est suspendu; il est dans une boucle infinie.Il est également intéressant de noter a ce point, c'est que c'est incroyablement mauvaise pratique de ne pas utiliser d'accolades avec tous les if/else. Il n'y a pas de raison de ne pas le faire, et il peut introduire des bugs facilement quand vous n'en avez pas.
dans
lookup()
, vous devriez avoir:et dans
delete()
:Maintenant, cela va produire ce que vous attendez:
De sortie:
Cependant, cela ne veut pas exposer votre deuxième, plus grand problème. Vous êtes en comparant valeurs de référence à l'aide de
==
lorsque l'on regarde le nœud dudata
.Ce qui "fonctionne" à l'instant à cause d'un effet secondaire de l'auto-boxing petites valeurs de type entier; vous obtenez les mêmes références d'objet. (Les littéraux de chaîne également de "travail" en raison de la chaîne de la piscine). Pour plus d'info sur ce, regardez Comment puis-je comparer les Chaînes de caractères en Java et Lors de la comparaison de deux nombres entiers en java auto-unboxing se produire
Regardons de plus près:
De sortie:
lookup()
cessé de fonctionner, permettant un double à être inséré.delete()
cessé de fonctionner ainsi.C'est parce que
int
des valeurs de plus de 127 auto-box uniqueInteger
objets plutôt que de mise en cache (voir le rattachement à la question ci-dessus pour une explication complète).N'importe où vous êtes à l'aide de
==
de comparer la valeur détenus pardata
doit être modifié pour utiliser.equals()
à la place.Avec ces problèmes techniques résolus, votre programme de travail. Il y a d'autres choses que vous devriez considérer si. Les deux que de sauter à droite sont:
lookup
doit retourner unboolean
.lookup()
dansdelete()
lookup
lui-même est assez inefficace comme une méthode distincte; Une insertion parcourt l'ensemble de la liste deux fois.==
. Si vous voulez savoir si deux objets en mémoire sont considérés comme égaux en raison de ce qu'ils contiennent, l'utilisation.equals()
null
est en fait un (spécial) valeur de référence. Il signifie que la variable n'est pas la tenue d'une référence à un objet en mémoire (qui est ce que vous êtes à la vérification de là).Tout d'abord pourquoi la recherche de retour d'un objet? changer de type boolean.
aussi votre boucle "while" dans
lookup()
ne fait pas avancer. vous devez supprimer le "else".votre fonction de suppression semble bien cependant.
Je pense que vous avez tout à fait quelques choses de mal.
Tout d'abord, lorsque vous utilisez LinkedList toutes les fonctionnalités dont vous avez essayé de mettre en application existe déjà.
De plus, le style est relativement mauvais. Par exemple, pourquoi utilisez-vous le WrapperClass Booléen pour la recherche?
Combinant des fonctionnalités comme le contient avec quelque chose comme obtenir dans une méthode n'est pas une bonne idée. Diviser cela en deux méthodes, laissez - contient il suffit de retourner une valeur de type boolean et de tester si un élément existe dans la liste. Laisser de recherche et de retour pour un élément.
En plus de cela, vous essayez de comparer les Objets à l'aide de l'égalité. Si vous n'avez pas écrasé est égal, vous ne pouvez pas supprimer quoi que ce soit jamais, car est égal besoins de référence de l'égalité qui n'est pas donné, la plupart du temps.
Je recommande fortement que vous achetez un java livre ou quelque chose pour améliorer votre connaissance globale..