Java链表删除指定价格挂饰遇空指针异常,求解决方案
问题分析与修复方案
核心问题
- 头节点删除时
back为空:当要删除的是链表第一个节点时,back始终为null,执行back.setNode(...)直接抛出空指针异常。 - 仅删除第一个匹配节点:原代码找到第一个符合条件的节点后就终止循环,无法删除所有价格匹配的挂饰。
- 浮点数直接比较风险:用
==比较double类型可能因为精度误差导致匹配失败,比如1.25在存储时的微小偏差会让判断失效。 - 循环内逻辑顺序错误:找到匹配节点后立刻执行删除,会中断后续节点的遍历,且未处理
current为最后一个节点的情况。
修复后的remove方法
void remove(double price) { CharmNode current = list; CharmNode back = null; while (current != null) { // 用精度阈值判断浮点数相等,避免精度误差 if (Math.abs(current.getCharm().getPrice() - price) < 1e-9) { // 处理头节点删除 if (back == null) { list = current.getNextNode(); } else { back.setNode(current.getNextNode()); } // 跳过已删除节点,继续检查后续节点 current = current.getNextNode(); } else { back = current; current = current.getNextNode(); } } }
其他优化建议
- 简化
findPrice方法:去掉冗余的back变量和found标记,逻辑更清晰:
public double findPrice(String name) { CharmNode current = list; while (current != null) { if (current.getCharm().getName().compareToIgnoreCase(name) == 0) { return current.getCharm().getPrice(); } current = current.getNextNode(); } return 0.0; }
- 优化
toString输出:避免额外打印,同时移除末尾多余的逗号:
@Override public String toString() { if (list == null) { return "<No Charms>"; } StringBuilder result = new StringBuilder(); CharmNode current = list; while (current != null) { result.append(current.getCharm().getName()).append(", "); current = current.next; } // 移除最后一个逗号和空格 return result.substring(0, result.length() - 2); }
修复后运行效果
执行Bracelet.remove(1.25)后,两个价格为1.25的挂饰会被全部删除,输出结果为:
YOLO, Donald Duck, Hello Kitty, Drums 10.0 1.25 Hello Kitty, Drums
内容的提问来源于stack exchange,提问作者Dewotto
相关产品推荐
相关产品推荐

