我正在尝试构建按字典顺序排列的链表。我在纸上计划了一切,并认为我需要一切正确,但是一旦我插入第二个或第三个条目,它返回一个空指针异常。
Exception in thread "main" java.lang.NullPointerException
at DoublyLL.insert(DoublyLL.java:88)
如果我输入,例如:
"chris", "andy", then "bob", "bob" returns the excpetion.
"chris", "bob", then "andy", "andy" returns the exception
"andy", "bob", I get the same exception with the addition of at DoublyLL$Node.access$000(DoublyLL.java:148)
代码:
public boolean insert(StudentListing newListing)
{ Node n = new Node();
if(n == null) // out of memory
return false;
else
{
Node q = new Node();
q = h;
int lex;
if (q.next == null) // first inputed node
{
n.next = q.next;
q.next = n;
n.back = q;
n.l = newListing.deepCopy();
return true;
} else // not first node
{
q = q.next;
do
{
// This is the line the error is called vvv
lex = q.l.getKey().compareTo(newListing.getKey());
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if (lex < 0)
{
// keep going
q = q.next;
} else if (lex > 0)
{
// place before q
n.back = q.back;
q.back = n;
n.next = q;
n.back.next = n;
return true;
} else if (lex == 0)
{
// q and listing match
}
} while (lex < 0);
}
}
return false;
}
Inner class
public class Node
{ private StudentListing l;
private Node next;
private Node back;
public Node()
{ }
}
答案 0 :(得分:1)
这里最大的问题是,当您将新的StudentListing
插入非空列表时,您会遍历列表,直到找到大于StudentListing
you'的元素为止重新插入。但是,如果您插入的StudentListing
大于列表中的任何元素,那么您永远不会找到这样的元素,因此您将在列表的末尾运行。在编写q = q.next
之前,您需要检查是否q.next == null
,并正确处理该案例。
(代码中还有各种非Java非主义 - 例如,if(n == null) // out of memory
将永远不会成为现实,因为Java通过引发异常而不是返回{表示内存不足错误{1}} - 但这些对我来说都不是一个主要问题。)