2017-01-09 2 views
1

Ich habe dieses Stück Code. Es ist syntaktisch korrekt, aber wenn ich versuche, einen Knoten von vorne zu entfernen, heißt es "Die Liste ist leer". Ich glaube, dass mein Fehler in der isEmpty Methode ist, weil es den falschen Wert zurückgibt, aber ich weiß nicht warum.Verknüpfte Liste entfernen

Könnten Sie mir bitte helfen, warum zu erkennen?

Hier ist mein Code:

public class link { 
    public String bookName ; 
    public int millionSold; 

    public link next ; 

    public static void main(String [] args) 
    { 
     linkList linkedlist = new linkList(); 
     linkedlist.insertLink("Head first java", 200); 
     linkedlist.insertLink("Head first design pattern", 400); 
     linkedlist.insertLink("Head first design", 600); 
     linkedlist.display(); 
     System.out.println(linkedlist.isEmpty()); 
     linkedlist.findItem("Abed"); 
    } 

    public void display() 
    { 
     System.out.println(bookName +":"+millionSold+"000.000"); 
    } 

    public link(String bookName,int millionSold) 
    { 
     this.bookName=bookName; 
     this.millionSold=millionSold; 
    } 
    public String toString() 
    { 
     return bookName ; 
    } 
} 

Linkliste

class linkList 
{ 
    public link firstLink ; 

    linkList() 
    { 
     firstLink = null ; 
    } 

    public boolean isEmpty() 
    { 
     boolean empty ; 
     if(firstLink==null) 
     { 
      empty = true ; 
     } 
     else 
     { 
      empty = false ; 
     } 
     return empty; 
    } 

    public void insertLink(String bookName , int millionSold) 
    { 
     link newLink = new link(bookName,millionSold); 

     newLink.next = firstLink; 
     firstLink=newLink ; 
    } 
    public link removeLink() 
    { 
     link linkReference = firstLink ; 
     if(!isEmpty()) 
      linkReference.next= firstLink; 
     else 
      System.out.println("The List is Empty"); 

     return linkReference ; 
    } 

    public void display() 
    { 
     while(firstLink!=null) 
     { 
      firstLink.display(); 
      System.out.println("The Next :"+firstLink.next); 
      firstLink = firstLink.next; 
      System.out.println(); 
     } 
    } 

     public link findItem(String bookName) 
     { 
      if(!isEmpty()) 
      { 
       while(firstLink.bookName != bookName) 
       { 
        if(firstLink.next == null) 
        { 
         return null ; 
        } 
        else 
        { 
         firstLink=firstLink.next; 
        } 
       } 
      } 
      else 
      { 
       System.out.println("Can not find a match"); 
      } 
      return firstLink ; 
     } 
    } 
+0

es ist oben, scrollen Sie einfach nach unten, um den ganzen Code zu sehen bitte –

+0

Es hat wahrscheinlich etwas mit der Tatsache zu tun, dass Sie Ihr 'firstLink' Feld in einigen Methoden ändern, die meiner bescheidenen Meinung nach keine Geschäfte haben, die den Zustand ändern Ihre Liste ('display' und' findItem') –

Antwort

0

Im removeLink die Zuordnung linkReference.next= firstLink; zugewiesen firstLink-linkReference.next wo infact Sie umgekehrt werden soll. Sie wollen firstLinklinkReference.next so sein, versuchen firstLink=linkReference.next;

Wechsel Eine weitere Beobachtung in display und findItem nicht verwenden firstLink, wie Sie den Zeiger auf der Liste (die einzigen Einstiegspunkt) ändern, wie Sie die Methode ausgeführt werden.

+0

es ergab das gleiche Ergebnis, check isEmpty Methode Fehler ist da, aber ich kann es nicht herausfinden –

+0

hast du die 'display' und' findItem' Methode aktualisiert sowie in die Antwort? –

+0

es funktionierte, wenn Sie wie oben erwähnt aktualisiert. eine andere Frage hier habe ich aktualisiert, aber ich habe Missverständnis , wenn ich einen Temp-Wert für den ersten Link in jeder Zeit verwenden müssen, ich möchte es unter diesen Methoden verwenden? –

0

Verwenden Sie die Temp-Variable (cursor unten), um durch Ihre Liste zu navigieren. Andernfalls definieren Sie null für firstLink und es scheint, als wäre die Liste leer.

public void display() 
{ 
    link cursor = firstLink; 
    while(cursor!=null) 
    { 
     cursor.display(); 
     System.out.println("The Next :"+cursor.next); 
     cursor = cursor.next; 
     System.out.println(); 
    } 
} 

und das gleiche zu tun, wo Sie eine Schleife durch die Liste wollen (ex. findItem()) wird ein besserer Ansatz.

0

Das Problem liegt in Ihrer display() -Methode. Sie durchlaufen die Liste und danach wird die Variable firstLink null. Sie benötigen eine temporäre Variable nur für Iteration im Display() -Methode zu verwenden, wie:

link tempLink = firstLink; 
while (tempLink != null) { 
    tempLink.display(); 
    System.out.println("The Next: " + firstLink.next); 
    tempLink = tempLink.next; 
    System.out.println(); 
} 

Verwenden Sie die gleiche Technik in anderen Orten, wo Sie durch die Liste iterieren wollen aber keinen Kopf ändern (zB findItem() -Methode).

Ich würde auch empfehlen, Name aller Klassen in Java groß schreiben. Sie können mehr über Java Namenskonventionen here lesen.