链表偶数位置元素移至奇数位置后代码触发段错误如何解决
问题根因
你代码中的段错误触发在奇数长度链表的场景下,核心原因是:
当链表总节点数为奇数时,循环逻辑执行结束后even指针会被赋值为NULL,此时你直接访问even->next赋值属于空指针访问,直接触发内存违规。
以7节点的测试用例为例,循环执行到最后一轮时:
odd指针走到第7个节点(最后一个奇数位节点),odd->next = NULL- 执行
even->next = odd->next后,even会被赋值为NULL - 后续进入
if (odd->next == NULL)分支时,直接操作even->next就会触发崩溃
修复方案
需要做两处调整:
- 函数开头增加边界校验,处理空链表、仅1个节点的极端场景,避免无意义的执行逻辑
- 给
even->next赋值前,先判断even指针非空,再执行赋值操作
修改后的EvenOdd函数代码如下:
void EvenOdd(node *&head) { // 新增边界判断:空链表或只有1个节点无需重排 if (head == NULL || head->next == NULL) { return; } node *odd = head; node *even = head->next; node *evenStart = even; while (odd->next != NULL && even->next != NULL) { odd->next = even->next; odd = odd->next; even->next = odd->next; even = even->next; } // 仅当even非空时才赋值next为NULL if (odd->next == NULL && even != NULL) { even->next = NULL; } odd->next = evenStart; }
验证效果
修改后两个测试用例均可正常运行:
- 6节点偶数长度输入:
{1,2,3,4,5,6}→ 输出1 3 5 2 4 6 - 7节点奇数长度输入:
{1,2,3,4,5,6,7}→ 输出1 3 5 7 2 4 6
内容的提问来源于stack exchange,提问作者Jay1105
相关产品推荐
相关产品推荐

