在双链表中添加对象之前/之后的问题

时间:2014-10-26 13:49:58

标签: java algorithm data-structures

我尝试将项目添加到双链表中,并尝试按照比较字符串的正确顺序添加它们。

   public boolean add(Book book)
{
    Node current    =   new Node(book);

    if(firstNode == null)
    {
        firstNode   =   current;
        lastNode    =   current;
        numElements++;
        return true;
    }


    else
    {
        Node tempNode   =   firstNode;
        int val = -1;
        while(tempNode != null)
        {
            if(tempNode.bookElement.compareTo(book) > 0)
            {
                val = 1;
                break;
            }

            else if(tempNode.bookElement.compareTo(book) == 0)
                    return false;
            else
            {
                val = -1;
                tempNode    =   tempNode.next;

            }
        }


            if(val > 0)
            {
                System.out.println("next: " + tempNode.bookElement.getISBN());

                current.next        =   tempNode;
                if(tempNode == firstNode)
                    tempNode.previous   =   current;


                 if(current.previous == null)
                    firstNode   =   current;

                numElements++;

                return true;
            }


            else
            {
                current.previous    =   tempNode;
                tempNode.next      =   current;
                lastNode            =   current;
                numElements++;
                return true;
            } 


    }

}

以下是我添加对象的方法:

Book[] books    =   new Book[4];
    books[0]        =   new Book("a", "charles g", "book1");
    books[1]        =   new Book("b", "michael b", "book2");
    books[2]        =   new Book("c", "james k", "book3");
    books[3]        =   new Book("d", "gsdgsdgg g", "book4");


    BookList booklist =   new BookList();
    booklist.add(books[0]);
    booklist.add(books[1]);
    booklist.add(books[2]);
    booklist.add(books[3]);

使用第一个参数的字符串compareTo比较对象,即" a"或" b"

目前,如果我切换订单,我可以将列表正确排序,即" a" =" d"," b" =" c"等等,但如果我把它保持在现在的状态并尝试排序我得到一个空指针:

tempNode.next      =   current;

如果我行

while(tempNode != null)

while(tempNode.next != null)

然后列表按顺序排序,我可以将其保存为a,b,c,d。但是我想要能够正确地对它进行排序,无论我添加它们的顺序如何,所以我认为我添加它们的方式存在一些非常错误。

编辑:

我将列表向后添加,因此添加d,c,b,第一个按预期工作,因为它没有检查第一个节点的while块中的if语句,因为第一个节点接下来是null所以我把它放到一个dowhile,以便它检查它,但当我尝试通过a,b,c,d正常运行时,我仍然得到一个空指针。空指针发生在while(tempNode.next!= null)

do
        {
            if(tempNode.bookElement.compareTo(book) > 0)
            {
                val = 1;
                break;
            }

            else if(tempNode.bookElement.compareTo(book) == 0)
                    return false;
            else
            {
                val = -1;
                tempNode    =   tempNode.next;
            }
        }

        while(tempNode.next != null);

1 个答案:

答案 0 :(得分:1)

您当前的代码无法将节点添加到列表的末尾,因为在这种情况下tempNode变为空,tempNode.next为您提供NullPointerException

您应该将条件更改为while(tempNode.next != null),但如果在循环val < 0之后,您必须将currenttempNode进行比较,以确定是否current应在tempNode之前或之后插入。