2011-10-25 4 views
2

J'ai un problème avec l'ajout d'éléments dans la liste n'a pas aiméInsertion dans la liste chaînée Doublement

public class LinkedList { 
    public Node first; 
    public Node last; 

    public LinkedList() { 
     first = null; 
     last = null; 
    } 

    public void addFirst(Student student) { 
     Node f = first; 
     Node newNode = new Node(student); 
     first = newNode; 
     if (f == null) last = newNode; 
     else f.previous = newNode; 
    } 

    public void addLast(Student student) { 
     Node l = last; 
     Node newNode = new Node(student); 
     last = newNode; 
     if (l == null) first = newNode; 
     else { 
      l.next = newNode; 
     } 
    } 


    public void display() { 
     Node current = first; 
     while (current != null) { 
      //print... 
      current = current.next; 
     } 
    } 

Mon problème est quand je lance:

list.addLast(1); 
list.addFirst(2); 
list.display(); 

Il affiche juste « 2 » méthode « d'affichage » juste ne peut pas voir le dernier élément ajouté.
Mais si je lance:

list.addFirst(2); 
list.addLast(1); 

Il affiche à la fois. Quel est le problème avec? Merci.

Répondre

2

dans addFirst vous avez aussi mettre newNode.next = f, vous en ce moment la mise à jour d'un seul côté de la relation bidirectionnelle. Et puisque l'affichage utilise le champ suivant, il ne fonctionne pas comme prévu.

De même, dans addLast, vous devez ajouter newNode.previous = l, mais comme le champ précédent n'est pas utilisé dans la méthode d'affichage, il n'apparaît pas buggé lorsque vous l'exécutez.

4

Si cette liste est doublement liée, ne devriez-vous pas ajouter une référence dans newNode aux éléments qui viennent avant/après?

méthode

Votre affichage() traverse node.next mais vous addFirst() jamais mis .next - donc si vous appelez addFirst() plusieurs fois, et seulement cette méthode, ce qui sera imprimé display()?

+0

Je comprends, il va imprimer juste le dernier élément ajouté. – Nikita

0
public void addFirst(Student student) { 
    Node f = first; 
    Node newNode = new Node(student); 
    newNode.next = f; // this was missing 
    first = newNode; 
    if (f == null) 
     last = newNode; 
    else 
     f.previous = newNode; 
} 

public void addLast(Student student) { 
    Node l = last; 
    Node newNode = new Node(student); 
    newNode.previous = l; // this was missing 
    last = newNode; 
    if (l == null) 
     first = newNode; 
    else 
     l.next = newNode; 
} 
Questions connexes