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

Java链表实现在现有节点间插入新节点的异常问题求助

问题原因分析
  • 插入节点的执行顺序错误:你现有代码中先执行curr.setNext(newNode)修改当前节点的后继指针,再执行newNode.setNext(curr.getNext()),此时curr.getNext()已经被改写为新节点的地址,最终新节点的后继指针指向自身,原后续的8、9节点失去引用被回收,这是节点丢失的直接原因。
  • 容量校验逻辑位置错误:你在插入操作完成后才判断链表是否超过最大容量,此时插入行为已经执行完毕,异常抛出无法起到拦截作用,应该将容量校验放在插入逻辑最前面。
  • 缺少索引合法性校验,且插入完成后没有更新链表的size计数,会导致后续的容量判断和索引定位出错。
  • 结合你给出的预期结果,插入7后不需要保留原后续的8、9节点,直接将新节点的后继指针设为null即可。
修改后代码
@Override
public void insert(int index, E data) throws ListOverflowException {
    // 先做容量校验
    if (size == maxSize) {
        throw new ListOverflowException("Error! Can't add any more nodes");
    }
    // 索引合法性校验
    if (index < 0 || index > size) {
        throw new IndexOutOfBoundsException("Invalid insert index");
    }

    Node<E> curr = startOfNode;
    int ctr = 0;

    // 定位到要插入位置的前驱节点
    for (curr = startOfNode; curr !=null; curr = curr.getNext()) {
        if (ctr == index) {
            Node<E> newNode = new Node<>(data);
            // 按预期结果要求截断后续节点,直接将新节点后继设为null
            newNode.setNext(null);
            curr.setNext(newNode);
            // 插入完成后更新size
            size++;
            break;
        }
        ctr++;
    }
}

如果你需要保留原后续的8、9节点,只需要将newNode.setNext(null)改为newNode.setNext(curr.getNext()),并且将这行代码放在curr.setNext(newNode)之前执行即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:03:05