使用IntNode实现的链表元素移除函数失效求助
问题分析与修复
原代码的致命错误
if语句的多余分号
if (p.GetValue() == n);末尾的分号会让if的逻辑体为空,导致后续的list = Remove(list, p);每次循环都会执行,不管当前节点的值是不是n。这直接导致大量节点被错误删除,最终出现不符合预期的输出。遍历逻辑缺陷
即使去掉分号,原代码的遍历方式也有问题:当你调用Remove删除节点p后,p已经不属于当前链表,继续执行p = p.GetNext()会访问无效的节点引用,引发异常或遍历混乱。同时,每次删除后链表头节点可能改变,原遍历指针p指向的是旧链表的节点,会导致后续判断完全错误。
修复方案(不依赖外部Remove函数,更稳妥)
直接在函数内实现链表删除逻辑,避免依赖外部函数的潜在问题:
public static IntNode hamesh(IntNode list, int n) { // 先处理头节点需要删除的情况 while (list != null && list.GetValue() == n) { list = list.GetNext(); } if (list == null) return null; IntNode current = list; // 遍历后续节点,用前驱节点跟踪 while (current.GetNext() != null) { if (current.GetNext().GetValue() == n) { // 删除下一个节点:直接让当前节点的Next指向目标节点的Next current.SetNext(current.GetNext().GetNext()); } else { // 只有未删除节点时才移动指针,避免跳过节点 current = current.GetNext(); } } return list; }
如果必须使用外部Remove函数的修复版本
public static IntNode hamesh(IntNode list, int n) { // 先循环处理头节点是目标值的情况 while (list != null && list.GetValue() == n) { list = Remove(list, list); } IntNode p = list; while (p != null && p.GetNext() != null) { if (p.GetNext().GetValue() == n) { // 删除下一个节点 list = Remove(list, p.GetNext()); // 删除后不移动p,因为p的Next已经更新,需要重新检查新的下一个节点 } else { p = p.GetNext(); } } return list; }
内容的提问来源于stack exchange,提问作者joee__mama
相关产品推荐
相关产品推荐

