如何通过传入Node编号完成双向链表中对应节点的删除操作?
双向链表按节点编号删除功能实现
原代码问题梳理
- 未执行遍历查找逻辑:直接new了一个全新的
NodeLine对象,该对象不属于当前链表,不可能是要删除的目标节点 - 节点匹配逻辑错误:判断
firstLine == newLine完全不成立,新创建的对象和链表头节点不可能是同一个引用 - 缺少边界校验:未处理输入的
linenum超过链表总长度的情况 - 未覆盖尾节点变更场景:如果删除的是尾节点,没有同步更新尾节点引用
- 代码语法缺陷:缩进混乱,if分支的大括号闭合错误
正确实现逻辑
- 首先校验输入的节点编号合法性,小于1直接报错返回
- 从链表头节点开始遍历,找到第
linenum个对应的目标节点,遍历到链表末尾还没找到就提示位置超出范围 - 调整目标节点前后节点的指针指向:
- 目标节点是头节点:将头节点引用指向目标节点的下一个节点
- 目标节点是尾节点:将尾节点引用指向目标节点的前一个节点
- 目标节点是中间节点:将前节点的next指向目标的next,后节点的prev指向目标的prev
- 目标节点无引用后自动被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
相关产品推荐
相关产品推荐

