节点类
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;
}
我在
行获得Null Pointer ExceptionE tmp = head.data;
删除方法中的
如果将insert方法中的else语句更改为
,则会修复错误else
prev.next = newNode;
newNode.next = curr;
答案 0 :(得分:1)
当您插入需要在列表开头的新节点时出现问题(因为它小于当前头节点)。当你到达这个部分时:
if(prev == null)
head = newNode;
您将head
设置为刚刚创建的新节点,但您还需要将newNode.next
设置为之前的head
。所以你真的想要
if(prev == null) {
newNode.next = head;
head = newNode;
}
在开头插入新节点,但将前一个节点固定在它上面。
使用你的代码,当你添加第二个应该在开头的元素时,你会意外丢弃已经存在的元素,但是你仍在增加currentSize
;所以你最终得到的列表只有一个元素,但currentSize
为2.当你尝试删除两个元素时,第二个元素因{1}}而失败,因为你试图读取里面的数据一个不存在的元素。