2017-01-09 97 views
1

我有這段代碼。它在語法上是正確的,但是當我試圖從前面刪除一個節點時,它說「列表是空的」。 我相信我的錯誤是在isEmpty方法中,因爲它返回錯誤的值,但我不知道爲什麼。鏈接列表刪除

你能幫我找出原因嗎?

這裏是我的代碼:

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 ; 
    } 
} 

鏈表

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

它是上面提供的,只是向下滾動才能看到整個代碼 –

+0

它可能與您修改您的firstLink字段的一些事實有關,這些方法在我的愚蠢觀點中沒有業務修改狀態你的清單('display'和'findItem') –

回答

0

removeLink分配firstLink分配linkReference.next= firstLink;到INFACT你要反過來linkReference.next。你想firstLinklinkReference.next所以儘量改變firstLink=linkReference.next;

另一種看法是displayfindItem不使用firstLink爲你改變指針到列表(你唯一的入口點)的運行方法。

+0

它給出了相同的結果,檢查isEmpty方法 有錯誤,但我無法弄清楚 –

+0

你更新了'display'和'findItem'方法,以及答案? –

+0

它在上面提到的更新時起作用。 另一個問題,在這裏我已經更新,但我有誤解 當我不得不在每次我想在這些方法中使用它的第一次使用臨時值? –

0

使用臨時變量(下面的cursor)來瀏覽列表。否則,你將首先定義null,看起來像列表是空的。

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

,並在那裏你通過名單要循環做同樣的(前。findItem())將是更好的方法。

0

問題出在您的display()方法中。您遍歷列表,之後變量將變爲空。您需要添加一個臨時變量只是反覆在顯示屏()方法,如:

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

使用在您遍歷列表,但不希望改變頭部其他地方同樣的技術(例如, findItem()方法)。

我還建議大寫Java所有類的名稱。您可以閱讀關於Java命名慣例here的更多信息。