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

如何通过传入Node编号完成双向链表中对应节点的删除操作?

双向链表按节点编号删除功能实现

原代码问题梳理

  • 未执行遍历查找逻辑:直接new了一个全新的NodeLine对象,该对象不属于当前链表,不可能是要删除的目标节点
  • 节点匹配逻辑错误:判断firstLine == newLine完全不成立,新创建的对象和链表头节点不可能是同一个引用
  • 缺少边界校验:未处理输入的linenum超过链表总长度的情况
  • 未覆盖尾节点变更场景:如果删除的是尾节点,没有同步更新尾节点引用
  • 代码语法缺陷:缩进混乱,if分支的大括号闭合错误

正确实现逻辑

  1. 首先校验输入的节点编号合法性,小于1直接报错返回
  2. 从链表头节点开始遍历,找到第linenum个对应的目标节点,遍历到链表末尾还没找到就提示位置超出范围
  3. 调整目标节点前后节点的指针指向:
    • 目标节点是头节点:将头节点引用指向目标节点的下一个节点
    • 目标节点是尾节点:将尾节点引用指向目标节点的前一个节点
    • 目标节点是中间节点:将前节点的next指向目标的next,后节点的prev指向目标的prev
  4. 目标节点无引用后自动被JVM回收,完成删除

正确实现代码

// 假设你的双向链表类中维护了头节点firstLine、尾节点lastLine两个成员变量
public void DeleteLine(int linenum) {
    // 编号合法性校验
    if (linenum < 1) {
        System.out.print("\nposition should be >= 1.");
        return;
    }
    // 遍历查找第linenum个节点
    NodeLine current = firstLine;
    int count = 1;
    while (current != null && count < linenum) {
        current = current.getNextLine();
        count++;
    }
    // 没找到对应节点,说明编号超过链表长度
    if (current == null) {
        System.out.print("\nposition exceeds the length of the linked list.");
        return;
    }
    // 处理前节点的指针
    if (current.getPrevLine() != null) {
        current.getPrevLine().setNextLine(current.getNextLine());
    } else {
        // 要删除的是头节点,更新头节点引用
        firstLine = current.getNextLine();
    }
    // 处理后节点的指针
    if (current.getNextLine() != null) {
        current.getNextLine().setPrevLine(current.getPrevLine());
    } else {
        // 要删除的是尾节点,更新尾节点引用
        lastLine = current.getPrevLine();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:06