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

Java链表删除指定价格挂饰遇空指针异常,求解决方案

问题分析与修复方案

核心问题

  1. 头节点删除时back为空:当要删除的是链表第一个节点时,back始终为null,执行back.setNode(...)直接抛出空指针异常。
  2. 仅删除第一个匹配节点:原代码找到第一个符合条件的节点后就终止循环,无法删除所有价格匹配的挂饰。
  3. 浮点数直接比较风险:用==比较double类型可能因为精度误差导致匹配失败,比如1.25在存储时的微小偏差会让判断失效。
  4. 循环内逻辑顺序错误:找到匹配节点后立刻执行删除,会中断后续节点的遍历,且未处理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();
        }
    }
}

其他优化建议

  1. 简化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;
}
  1. 优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:15:29