链接列表删除

问题描述:

我有这段代码。它在语法上是正确的,但是当我试图从前面删除一个节点时,它说“列表是空的”。 我相信我的错误是在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') –

removeLink分配firstLink分配linkReference.next= firstLink;到INFACT你要反过来linkReference.next。你想firstLinklinkReference.next所以尽量改变firstLink=linkReference.next;

另一种看法是displayfindItem不使用firstLink为你改变指针到列表(你唯一的入口点)的运行方法。

+0

它给出了相同的结果,检查isEmpty方法 有错误,但我无法弄清楚 –

+0

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

+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())将是更好的方法。

问题出在您的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的更多信息。