有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    当您插入一个需要转到列表开头的新节点时会出现问题(因为它比当前头节点小)。当您进入此部分时:

    if(prev == null) 
            head = newNode;
    

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

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

    它在开始处插入新节点,但将前一个头钉在其上

    在代码中,当您添加第二个应该在开头的元素时,您意外地丢弃了已经存在的元素,但仍然在增加currentSize;因此,最终得到的列表只有一个元素,但是currentSize是2。然后,当您尝试删除两个元素时,第二个元素将以NullPointerException失败,因为您试图读取不存在的元素中的数据