节点类
private class Node<E> {
E data;
Node<E> next;
public Node(E obj) {
data = obj;
next = null;
}
}
插入方法(升序)
public void insert(E obj) {
Node<E> newNode = new Node<E>(obj);
Node<E> prev = null, curr = head;
while(curr != null && ((Comparable<E>)obj).compareTo(curr.data) >= 0) {
prev = curr;
curr = curr.next;
}
if(prev == null)
head = newNode;
else {
prev.next = newNode;
newNode.next = curr;
}
currentSize++;
}
删除方法
public E remove() {
if(isEmpty())
return null;
E tmp = head.data;
head = head.next;
currentSize--;
return tmp;
}
我在该行遇到空指针异常
E tmp = head.data;
在删除方法中
如果将我的插入方法中的 else 语句更改为
,则错误已修复else
prev.next = newNode;
newNode.next = curr;
最佳答案
当您插入需要位于列表开头的新节点时会出现问题(因为它比当前头节点小)。当您到达这部分时:
if(prev == null)
head = newNode;
您将 head
设置为刚刚创建的新节点,但您还需要将 newNode.next
设置为前一个 head
。所以你真的想要
if(prev == null) {
newNode.next = head;
head = newNode;
}
在开头插入新节点,但将前一个头固定在其上。
按照您的代码,当您添加第二个应该放在开头的元素时,您会意外地丢弃已经存在的元素,但您仍在增加 currentSize
;因此,您最终会得到一个只有一个元素的列表,但 currentSize
为 2。然后,当您尝试删除两个元素时,第二个元素会失败并出现 NullPointerException
,因为您尝试读取不存在的元素内的数据。
关于java - 有人可以解释一下这个链表空指针异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454651/