链表反转时触发‘write access violation - temp was nullptr’错误求助
栈实现链表反转时的空指针访问错误排查与修复
错误原因分析
触发write access violation - temp was nullptr的直接原因:
- 第一个遍历链表并压栈的循环结束后,
temp走到链表末尾,已经变成nullptr。此时执行head = temp,会把新链表头设为空。 - 进入第二个循环时,
temp仍然是nullptr,尝试访问temp->next必然触发空指针访问错误。 - 原逻辑未正确初始化反转后的链表头,栈顶元素本应是反转后的新头节点,却没有被正确赋值给
head。
修复后的代码
#include <stack> #include <cstdio> using namespace std; struct ListNode { int data; ListNode* next; ListNode() : data(0), next(nullptr) {} ListNode(int value) : data(value), next(nullptr) {} ListNode(int value, ListNode* pointer) : data(value), next(pointer) {} }; int main() { ListNode* third = new ListNode(12, nullptr); ListNode* second = new ListNode(8, third); ListNode* head = new ListNode(5, second); stack<ListNode*> reversed; ListNode* temp = head; while (temp) { // 将所有节点压入栈 reversed.push(temp); temp = temp->next; } // 栈顶元素作为反转后的新头节点 if (!reversed.empty()) { head = reversed.top(); reversed.pop(); temp = head; } while (!reversed.empty()) { // 弹出栈顶节点并连接到当前节点的next temp->next = reversed.top(); reversed.pop(); // 移动到下一个节点 temp = temp->next; } // 最后一个节点的next设为nullptr,避免循环引用 if (temp != nullptr) { temp->next = nullptr; } // 打印验证反转结果 temp = head; while (temp) { printf("%d ", temp->data); temp = temp->next; } // 释放内存,避免泄漏 temp = head; while (temp) { ListNode* next = temp->next; delete temp; temp = next; } return 0; }
关键修复点
- 从栈顶取出第一个节点作为反转后的新
head,并初始化temp指向该节点,避免空指针操作。 - 调整第二个循环逻辑,确保每次操作的
temp都是有效节点指针。 - 添加空栈判断,处理空链表的边界情况。
- 补充内存释放代码,修复原代码的内存泄漏问题。
内容的提问来源于stack exchange,提问作者kanulilewa
相关产品推荐
相关产品推荐

