求助:尝试移除链表循环但代码失效,需排查修正
链表循环移除代码问题排查与修正
原代码存在的问题
- 未处理无循环场景:如果链表本身没有循环,
fast会走到NULL,此时后续的while(current!=slow)会陷入死循环,甚至触发空指针访问错误。 - 循环入口为头节点时的空指针异常:如果整个链表是一个环(循环入口就是
head),current和slow初始就相等,prev未被赋值就执行prev->next=NULL,直接导致程序崩溃。 - 逻辑完整性缺失:没有对相遇后的场景做分支判断,直接执行后续代码,忽略了多种边界情况。
修正后的代码
class Solution { public: //Function to remove a loop in the linked list. void removeLoop(Node* head) { if (head == nullptr || head->next == nullptr) { return; // 空链表或单节点,不可能存在循环 } Node *slow = head, *fast = head; bool hasLoop = false; // 第一步:快慢指针检测循环是否存在 while (fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; if (slow == fast) { hasLoop = true; break; } } if (!hasLoop) { return; // 无循环,直接返回 } // 第二步:定位循环入口并断开 Node *current = head; // 特殊情况:相遇点就是头节点,说明整个链表成环 if (slow == head) { // 遍历找到环的最后一个节点 while (slow->next != head) { slow = slow->next; } slow->next = nullptr; } else { // 常规情况:current从head出发,slow从相遇点出发,同步移动直到找到入口前节点 while (current->next != slow->next) { current = current->next; slow = slow->next; } slow->next = nullptr; } } };
修正说明
- 新增无循环判断:提前过滤空链表、单节点等不可能存在循环的场景,检测到无循环时直接返回,避免无效执行。
- 处理环入口为头节点的边界情况:单独遍历找到环的尾节点,断开其与头节点的连接,解决空指针问题。
- 优化入口查找逻辑:通过
current->next != slow->next的判断,直接定位到循环入口的前一个节点,无需额外维护prev变量,逻辑更简洁。 - 规范语法:使用C++标准的
nullptr替代0做空指针判断,代码更易读。
内容的提问来源于stack exchange,提问作者adarsh raj
相关产品推荐
相关产品推荐

