链表中间节点获取异常:奇数节点时出现段错误求助
解决链表中间节点获取时奇数节点场景的段错误问题
问题根源
- 段错误直接原因:原代码中先移动快慢指针再做条件判断,当链表节点数为奇数时,
fast会走到最后一个节点(此时fast->next为NULL),后续执行fast = fast->next->next等同于访问NULL->next,触发非法内存访问导致段错误。 - 逻辑冗余与低效:
- 循环中
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
相关产品推荐
相关产品推荐

