java有人能解释这个链表空指针异常吗?
节点类
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;
在remove方法中
如果将insert方法中的else语句更改为
else
prev.next = newNode;
newNode.next = curr;
# 1 楼答案
当您插入一个需要转到列表开头的新节点时会出现问题(因为它比当前头节点小)。当您进入此部分时:
您将
head
设置为刚创建的新节点,但还需要将newNode.next
设置为前一个head
。所以你真的想要它在开始处插入新节点,但将前一个头钉在其上
在代码中,当您添加第二个应该在开头的元素时,您意外地丢弃了已经存在的元素,但仍然在增加
currentSize
;因此,最终得到的列表只有一个元素,但是currentSize
是2。然后,当您尝试删除两个元素时,第二个元素将以NullPointerException
失败,因为您试图读取不存在的元素中的数据