You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表反转时触发‘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:40:27