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

移除有序链表重复元素时代码触发段错误如何解决?

段错误原因分析

你的代码在特定测试用例下触发段错误,核心是3处未做边界校验的空指针解引用,同时还存在内存泄漏问题,具体问题点如下:

  • 未处理空链表场景:removeDuplicates 函数初始直接访问 curr->next,如果传入的head本身是空指针(空链表),第一行循环判断就会解引用空指针触发崩溃。
  • remove函数循环无边界校验:循环判断条件curr->data==curr->next->data没有提前判断curr->next是否为空。如果链表尾部存在连续重复节点,curr指针一路后移到最后一个节点时,curr->next为NULL,此时访问curr->next->data直接触发空指针错误。
  • 未处理删除后到达链表尾部的场景:如果整个链表所有节点值都重复,remove函数执行完会返回NULL,赋值给curr后,下一轮循环判断curr->next时再次解引用空指针崩溃。
  • 附带内存泄漏问题:连续重复的中间节点没有被释放,只删除了最后一个重复节点,会产生野指针和内存泄漏。
修正后的代码
Node *remove(Node *curr){
    int duplicateVal = curr->data;
    // 先判断next非空再访问next的成员,逐个删除后续重复节点
    while(curr->next != NULL && curr->next->data == duplicateVal){
        Node *delNode = curr->next;
        curr->next = delNode->next;
        delete delNode;
    }
    return curr->next;
}

// 有序链表去重函数
Node *removeDuplicates(Node *head)
{
    // 空链表直接返回
    if(head == NULL){
        return NULL;
    }
    Node *curr = head;
    // 每次循环先判断curr非空,再访问curr->next
    while(curr != NULL && curr->next != NULL){
        if(curr->data == curr->next->data){
            curr->next = remove(curr);
        }
        else{
            curr = curr->next;
        }     
    }
    return head;
}

修正核心逻辑:所有访问指针成员的场景,都先校验指针非空;删除连续重复节点时逐个释放后续重复节点,既避免内存泄漏,也不需要额外移动当前节点指针,从根源上减少空指针触发风险。

内容的提问来源于stack exchange,提问作者SAUMYA PANDEY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:39:32