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

求助:尝试移除链表循环但代码失效,需排查修正

链表循环移除代码问题排查与修正

原代码存在的问题

  • 未处理无循环场景:如果链表本身没有循环,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:29