链表归并排序(MergeSort)实现出现段错误(Segmentation fault),求代码排查
链表归并排序代码的段错误原因定位
核心Bug位于
mergeSort函数的递归终止判断逻辑
原代码书写的判断语句:if(head==NULL && head->next!=NULL){ return head; }存在三处问题:
- 逻辑运算符误用:归并排序的递归终止条件应为「链表为空,或链表仅存1个节点(即
head->next == NULL)」,两类场景满足任意一个就无需继续拆分递归,应使用逻辑或||,而非原代码的逻辑与&& - 空指针解引用风险:若传入的
head为NULL,判断分支中访问head->next的操作会直接触发段错误 - 终止逻辑完全失效:由于
&&的短路特性,当head为有效非空节点时,第一个条件head==NULL不成立,整个判断结果恒为假,根本不会触发return返回分支,会引发两类连锁崩溃:- 单节点链表不会触发终止流程,会重复执行拆分、递归调用自身的逻辑,造成无限递归、栈溢出
- 拆分得到的后半段链表为空时,传入
mergeSort会直接在判断分支解引用空指针崩溃
修正后的终止条件为:
if (head == NULL || head->next == NULL) { return head; }- 逻辑运算符误用:归并排序的递归终止条件应为「链表为空,或链表仅存1个节点(即
其余模块逻辑校验:
findmiddle采用快慢指针、fast初始值为head->next的实现正确,可准确定位链表前半段的尾节点,适配拆分需求merge函数通过双指针对比节点值、尾指针跟踪拼接的合并逻辑正确,无明显漏洞
内容的提问来源于stack exchange,提问作者praveen prakash
相关产品推荐
相关产品推荐

