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

链表中间节点获取异常:奇数节点时出现段错误求助

解决链表中间节点获取时奇数节点场景的段错误问题

问题根源

  1. 段错误直接原因:原代码中先移动快慢指针再做条件判断,当链表节点数为奇数时,fast会走到最后一个节点(此时fast->next为NULL),后续执行fast = fast->next->next等同于访问NULL->next,触发非法内存访问导致段错误。
  2. 逻辑冗余与低效:
    • 循环中current指针完全多余,快慢指针本身可控制循环终止条件
    • 每次循环调用list_size重复遍历链表,时间复杂度从O(n)恶化至O(n²)
    • 条件判断逻辑错误:奇数节点时fast最终指向最后一个节点(非NULL),而非代码中判断的fast == NULL

修复方案

采用标准快慢指针实现,核心是先判断再移动,确保指针操作安全:

// return middle node of linked list
node *middle_node(node *head)
{
    if (head == NULL)
    {
        return NULL;
    }
    
    node *slow = head;
    node *fast = head;
    
    // 仅当fast能安全走两步时继续循环
    while (fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    
    // 奇数节点:fast指向最后一个节点,slow即为中间节点
    // 若需偶数节点返回第二个中间节点,可替换为:
    // return fast != NULL ? slow : slow->next;
    return slow;
}

逻辑说明

  • 初始化slow和fast均指向链表头
  • 循环条件fast != NULL && fast->next != NULL保证fast可以安全执行两步移动,避免空指针访问
  • 循环终止时:
    • 奇数节点:fast停在最后一个节点,slow指向中间节点
    • 偶数节点:fast停在NULL,slow指向中间两个节点的第一个(如需第二个,返回slow->next即可)

额外优化

  • 删除无用的全局变量count
  • 原insert函数中return 0可改为return NULL,语义更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:56