链接列表删除
我有这段代码。它在语法上是正确的,但是当我试图从前面删除一个节点时,它说“列表是空的”。 我相信我的错误是在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 ;
}
}
在removeLink
分配firstLink
分配linkReference.next= firstLink;
到INFACT你要反过来linkReference.next
。你想firstLink
是linkReference.next
所以尽量改变firstLink=linkReference.next;
另一种看法是display
和findItem
不使用firstLink
为你改变指针到列表(你唯一的入口点)的运行方法。
它给出了相同的结果,检查isEmpty方法 有错误,但我无法弄清楚 –
你更新了'display'和'findItem'方法,以及答案? –
它在上面提到的更新时起作用。 另一个问题,在这里我已经更新,但我有误解 当我不得不在每次我想在这些方法中使用它的第一次使用临时值? –
使用临时变量(下面的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的更多信息。
它是上面提供的,只是向下滚动才能看到整个代码 –
它可能与您修改您的firstLink字段的一些事实有关,这些方法在我的愚蠢观点中没有业务修改状态你的清单('display'和'findItem') –