自定义LinkedList删除尾元素时抛出NullPointerException的问题求助
自定义LinkedList删除尾元素时抛出NullPointerException的问题求助
嘿,我来帮你排查这个问题!你的自定义LinkedList在删除尾元素时触发空指针异常,主要是踩了这几个坑:
问题根源分析
- 循环条件的空指针隐患:你在
while循环里直接用current.next.value != element做判断,当遍历到尾节点时,current.next是null,这时候访问current.next.value就会直接抛出NullPointerException。 - 未维护尾节点
last的引用:就算侥幸没触发空指针,删除尾节点后last依然指向旧的尾节点,后续调用toString这类依赖last的方法会出现数据不一致的问题。 - 未更新
size属性:删除元素后没有对size做递减操作,会导致链表记录的大小和实际元素数量不符,后续操作很容易出问题。 - 删除首节点后未处理空链表情况:如果删除的是链表最后一个元素(也就是首节点),
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
相关产品推荐
相关产品推荐

