You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我自定义实现的链表的get方法会抛出NullPointerException?

问题原因

addAtTail方法实现错误是触发空指针异常的根本原因:

  • 原addAtTail的逻辑是遍历到局部变量curr == null时停止,直接给局部变量curr赋值新节点,这个操作完全没有修改链表本身的节点引用关系,新节点根本没有被接入链表,同时size还被错误加1,导致后续所有涉及size校验的逻辑都出现判断偏差。

我们走你给出的操作序列可以复现完整报错路径:

  1. 执行MyLinkedList():head为null,size=0
  2. 执行addAtHead(1):head指向值为1的节点,size=1,正常
  3. 执行addAtTail(3):遍历链表时curr走到null后,给局部变量curr赋值新节点,链表本身完全没有变化,还是只有值为1的节点,但size被错误加为2
  4. 执行addAtIndex(1,2):此时size是2,index=1符合校验条件,进入遍历环节循环1次后,将值为2的节点接在值为1的节点之后,size加为3。此时链表实际结构为1→2→null,但size被标记为3
  5. 执行get(1):index=1 < size=3,校验通过,循环1次后curr走到值为2的节点,返回2,暂未触发异常
  6. 执行deleteAtIndex(1):删除下标1的节点,链表变为1→null,size减为2
  7. 执行get(1):index=1 < size=2,校验通过,循环执行1次后curr = curr.next得到null,此时访问curr.val直接触发NullPointerException
修复方案

首先修复addAtTail方法:

void addAtTail(int val) {
    // 将值为val的节点追加到链表末尾
    Node newNode = new Node(val);
    // 先处理链表为空的情况
    if (this.head == null) {
        this.head = newNode;
        size++;
        return;
    }
    Node curr = this.head;
    // 遍历到最后一个节点就停止,不要走到null
    while (curr.next != null) {
        curr = curr.next;
    }
    curr.next = newNode;
    size++;
}

另外你现有deleteAtTail方法也存在逻辑错误,无法正常删除尾节点,同步修复如下:

void deleteAtTail() {
    if (head == null) return;
    if (head.next == null) {
        head = null;
        size--;
        return;
    }
    
    Node curr = this.head;
    // 遍历到倒数第二个节点停止
    while (curr.next.next != null) {
        curr = curr.next;
    }
    curr.next = null;
    size--;
}

内容的提问来源于stack exchange,提问作者jattias96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:27:03