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

自定义LinkedList删除尾元素时抛出NullPointerException的问题求助

自定义LinkedList删除尾元素时抛出NullPointerException的问题求助

嘿,我来帮你排查这个问题!你的自定义LinkedList在删除尾元素时触发空指针异常,主要是踩了这几个坑:

问题根源分析

  1. 循环条件的空指针隐患:你在while循环里直接用current.next.value != element做判断,当遍历到尾节点时,current.next是null,这时候访问current.next.value就会直接抛出NullPointerException。
  2. 未维护尾节点last的引用:就算侥幸没触发空指针,删除尾节点后last依然指向旧的尾节点,后续调用toString这类依赖last的方法会出现数据不一致的问题。
  3. 未更新size属性:删除元素后没有对size做递减操作,会导致链表记录的大小和实际元素数量不符,后续操作很容易出问题。
  4. 删除首节点后未处理空链表情况:如果删除的是链表最后一个元素(也就是首节点),first被置为null但last还保留旧引用,也会引发潜在错误。

修复后的delete方法

我把这些问题都修复了,你可以参考下面的代码:

public void delete(double element) {
    if (first == null) {
        return;
    }

    // 处理删除首节点的情况
    if (first.value == element) {
        first = first.next;
        // 如果删除后链表为空,同步把last置为null
        if (first == null) {
            last = null;
        }
        size--;
        return;
    }

    Node current = first;
    // 先确保current.next不为null,再去比较值,避免空指针
    while (current.next != null && current.next.value != element) {
        current = current.next;
    }

    // 没找到要删除的元素,直接返回
    if (current.next == null) {
        return;
    }

    // 处理删除尾节点的情况,更新last引用
    if (current.next == last) {
        last = current;
    }

    // 跳过要删除的节点
    current.next = current.next.next;
    size--;
}

改动说明

  • 删除首节点时,增加了空链表判断:如果删除后first为null,同步把last也置为null,避免后续操作出错。
  • 调整while循环条件,先判断current.next != null再比较值,彻底规避空指针风险。
  • 增加尾节点判断逻辑:当要删除的节点是last时,把last更新为当前节点(新的尾节点)。
  • 每次成功删除元素后都递减size,保证链表大小记录的准确性。

现在再运行你的测试代码,删除尾元素80就不会报错了,toString也会正确输出[5,25,-7]。

备注:内容来源于stack exchange,提问作者Marlon Brando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:08:11