单链表回文判断代码触发空指针访问运行时错误求助
问题排查与修复:单链表回文判断的空指针错误
错误原因分析
- 未初始化变量
j:int j声明后未赋值,初始值为随机垃圾值。若输入链表为空,第一个while循环不会执行,j保持随机值,后续for循环会基于该值执行多次,导致temp变为NULL后仍访问temp->val,触发空指针异常。 - 回文检查死循环:最后一个
while (l<=r)循环未对l和r进行自增/自减操作,进入循环后会无限执行,无法完成完整的回文校验。 - 边界情况缺失:空链表属于回文结构,未提前处理会导致后续逻辑出错。
修复后的代码
class Solution { public: bool isPalindrome(ListNode* head) { // 处理空链表的边界情况 if (head == nullptr) { return true; } struct ListNode *temp = head; int j = 0; // 初始化长度计数器 vector<int> v; // 合并遍历:同时获取长度并存储节点值 while(temp != nullptr){ j++; v.push_back(temp->val); temp = temp->next; } int l = 0; int r = v.size() - 1; // 移动指针完成回文校验 while (l <= r){ if(v[l] != v[r]) { return false; } l++; r--; } return true; } };
额外优化说明
- 将获取链表长度和存储节点值的两次遍历合并为一次,减少链表遍历次数,提升执行效率。
- 使用
nullptr替代NULL,是C++11及以后版本更规范的空指针写法。 - 显式处理空链表的边界情况,避免后续逻辑触发异常。
内容的提问来源于stack exchange,提问作者user14075313
相关产品推荐
相关产品推荐

