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

链表创建问题:保存头指针后仅能访问首节点,无法遍历全链表求助

链表创建后只能访问第一个节点?看这里解决!

嘿,我明白你遇到的问题了——明明创建了多个节点,结果只能打出第一个的值,后面的都找不到对吧?先看看你代码里的核心问题,再给你修正方案。

首先,先还原你大概率没写完的创建逻辑(因为原代码没写完main函数的内容),问题肯定出在节点链接的步骤上:

你可能写了类似这样的创建代码:

#include <iostream>
using namespace std;
struct node {
    int val;
    node * next = nullptr;
    node(int a) { val = a; }
};
node * t = nullptr;
node * temp;
int main(int argc, char** argv) {
    for (int i = 0; i < 5; i++) {
        if (t == nullptr) {
            t = new node(i);
            temp = t;
        } else {
            temp = new node(i); // 就是这里错了!
        }
    }
    // 打印链表
    temp = t;
    while (temp != nullptr) {
        cout << temp->val << " ";
        temp = temp->next;
    }
    return 0;
}

为啥只能输出第一个节点?

你创建后续节点的时候,只是把temp重新指向了新节点,但完全没把这个新节点和之前的链表连起来!原来的头节点t的next还是nullptr,后面的节点都是孤立的“野节点”,遍历的时候自然找不到它们。

修正后的完整代码

我给你调整了代码逻辑,不仅能正确创建链表,还加了内存释放的好习惯:

#include <iostream>
using namespace std;
struct node {
    int val;
    node * next = nullptr;
    node(int a) : val(a) {} // 用初始化列表更规范高效
};

int main(int argc, char** argv) {
    node *head = nullptr; // 用head表示头节点,语义更清楚
    node *tail = nullptr; // 用tail跟踪链表末尾,方便加新节点

    // 创建0到4的链表
    for (int i = 0; i < 5; i++) {
        node *newNode = new node(i);
        if (head == nullptr) {
            // 第一个节点,头和尾都指向它
            head = newNode;
            tail = newNode;
        } else {
            // 把新节点接到链表尾部,然后更新tail到新末尾
            tail->next = newNode;
            tail = newNode;
        }
    }

    // 遍历打印所有节点
    node *current = head;
    while (current != nullptr) {
        cout << current->val << " ";
        current = current->next;
    }
    cout << endl;

    // 别忘了释放内存,避免内存泄漏
    current = head;
    while (current != nullptr) {
        node *temp = current;
        current = current->next;
        delete temp;
    }

    return 0;
}

关键调整说明

  • 用tail指针专门盯紧链表的最后一个节点,每次加新节点时,先把tail->next指向新节点,再把tail移到新节点上,这样整个链表就串起来了。
  • 把原来的全局指针移到main函数里了,全局变量容易搞混指针的指向,尽量在局部管理更安全。
  • 加了内存释放的代码,C++里用new创建的对象得手动用delete释放,不然会留内存泄漏的坑。
  • 构造函数改用初始化列表初始化val,比在函数体内赋值更规范,效率也更高。

运行这个修正后的代码,就能输出0 1 2 3 4啦!

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:13