HackerRank提交链表首尾节点求和代码报段错误原因排查
存在两个核心问题导致段错误:
1. 反转链表函数的传参逻辑错误
你当前的reverseList是值传递指针,函数内部给head = prev的赋值仅修改了局部变量,调用函数后外部的head2仍然指向反转前的旧头结点,且原第二个链表的节点指针已经被打乱,后续访问必然出现非法内存访问。
修正方案:修改reverseList为返回反转后的新头节点,用返回值更新head2:
SinglyLinkedListNode* reverseList(SinglyLinkedListNode* head) { SinglyLinkedListNode* prev = NULL; SinglyLinkedListNode* curr = head; SinglyLinkedListNode* next = NULL; while(curr) { next = curr->next; curr->next= prev; prev = curr; curr = next; } return prev; }
调用的时候改成head2 = reverseList(head2);
2. 求和循环的判断条件错误
你使用的while(ptr1 || ptr2)会在其中一个指针为空时仍然进入循环,此时访问空指针的data属性会直接触发段错误。因为你拆分后的两个链表,要么长度相等(原链表偶数长度),要么第一个链表比第二个长1(原链表奇数长度),仅需在两个指针都不为空时计算和即可。
修正方案:将循环条件改为:
while(ptr1 && ptr2)
边界处理补充(可选,避免单节点输入报错)
如果题目允许输入链表长度为1,可在函数开头加判断:
if(head->next == NULL) return head->data;
内容的提问来源于stack exchange,提问作者Mridul Adil
相关产品推荐
相关产品推荐

