有人可以解释这个链接列表空指针异常吗?

时间:2014-10-19 19:48:05

标签: java list pointers null

节点类

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 Exception
E tmp = head.data;
删除方法中的

如果将insert方法中的else语句更改为

,则会修复错误
else
    prev.next = newNode;
newNode.next = curr;

1 个答案:

答案 0 :(得分:1)

当您插入需要在列表开头的新节点时出现问题(因为它小于当前头节点)。当你到达这个部分时:

if(prev == null) 
        head = newNode;

您将head设置为刚刚创建的新节点,但您还需要将newNode.next设置为之前的head。所以你真的想要

if(prev == null) {
        newNode.next = head;
        head = newNode;
}

在开头插入新节点,但将前一个节点固定在它上面。

使用你的代码,当你添加第二个应该在开头的元素时,你会意外丢弃已经存在的元素,但是你仍在增加currentSize;所以你最终得到的列表只有一个元素,但currentSize为2.当你尝试删除两个元素时,第二个元素因{1}}而失败,因为你试图读取里面的数据一个不存在的元素。