Java单链表删除学生节点失败:代码运行后链表无变化
单链表删除节点无效的问题分析
你的代码存在几个关键问题,导致删除操作没有生效,逐个拆解:
字符串比较方法错误:Java中
==用于比较字符串时,对比的是对象的引用地址而非内容。判断姓名是否一致必须用equals()方法,示例修正:if (target.getStudent().getFirstName().equals(firstName) && target.getStudent().getLastName().equals(lastName))若担心空指针问题,可改用
Objects.equals()做安全比较。嵌套循环逻辑完全混乱:两层循环各自遍历链表,
ptr和target没有形成「前驱节点-当前节点」的对应关系,根本无法正确定位要删除节点的前驱。正确的单链表删除逻辑应该是用一个指针遍历,同时记录前驱节点,示例:SNode prev = null; SNode curr = studentsInLine; while (curr != null) { if (curr.getStudent().getFirstName().equals(firstName) && curr.getStudent().getLastName().equals(lastName)) { if (prev == null) { // 处理删除头节点的情况 studentsInLine = curr.getNext(); } else { prev.setNext(curr.getNext()); } // 若只需删除第一个匹配节点,此处可加break;要删除所有匹配则继续循环 break; } prev = curr; curr = curr.getNext(); }遗漏头节点和尾节点的处理:
- 外层循环从
studentsInLine开始,且循环条件为ptr.getNext() != null,导致头节点本身永远不会被检查,若要删除的是第一个学生,代码完全不会处理。 - 内层循环条件
target.getNext() != null,会让最后一个节点无法进入循环,自然不会被匹配删除。
- 外层循环从
匹配后无终止逻辑(可选):找到目标节点后若不跳出循环,
ptr会继续向后移动,可能导致后续指针修改错误,且重复遍历完全无意义。
内容的提问来源于stack exchange,提问作者Axe
相关产品推荐
相关产品推荐

