我尝试将项目添加到双链表中,并尝试按照比较字符串的正确顺序添加它们。
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);
答案 0 :(得分:1)
您当前的代码无法将节点添加到列表的末尾,因为在这种情况下tempNode
变为空,tempNode.next
为您提供NullPointerException
。
您应该将条件更改为while(tempNode.next != null)
,但如果在循环val < 0
之后,您必须将current
与tempNode
进行比较,以确定是否current
应在tempNode
之前或之后插入。