已删除链接列表

时间:2017-01-09 14:36:28

标签: java algorithm data-structures

我有这段代码。它在语法上是正确的,但当我试图从前面删除一个节点时,它表示"该列表为空"。 我认为我的错误在于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 ;
        }
    }

3 个答案:

答案 0 :(得分:0)

$ cat test 03:44:04.373 [127.0.0.1-8009-exec-178] INFO c.c.c.x.x.w.f.AuthenticationFilter - cachObj {"guid":"guid","userId":"aUserId","isPrimary":false,"accessToken":"accessToken"} $ awk -F"[:,]" '$1 ~ /^{/ {gsub("\"","",$4); print $4}' test aUserId 作业removeLink分配linkReference.next= firstLink;firstLink,其中你想要反过来。您希望linkReference.nextfirstLink,因此请尝试更改linkReference.next

另一个观察是firstLink=linkReference.next;display在您运行方法时更改指向列表的指针(唯一的入口点)时不使用findItem

答案 1 :(得分:0)

使用临时变量(下面为cursor)来浏览列表。否则,你将first定义为firstLink,看起来list是空的。

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

答案 2 :(得分:0)

问题出在你的display()方法中。您遍历列表,然后 firstLink 变量变为空。您需要在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命名Conventios here的更多信息。