java - 有人可以解释一下这个链表空指针异常吗?

标签 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;
}

我在该行遇到空指针异常

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/

相关文章:

java - 在这种情况下,我的 Java 线程真的会死掉吗?

java - 蓝牙低功耗安全异常

java - 在Java中按类获取子列表

list - 在 lisp 函数中使用带有 cons 的嵌套汽车

c - 导致访问冲突的指针逻辑

java - 使用 SuperCSV 清理单元格值

java - 当从另一个类调用方法时 - 返回一个难以理解的值 JAVA

string - read-string 和 load-string 之间是否有 clojure 函数?

c++ - 删除STL指针 vector 条目的快速方法

C数组地址混淆