链表创建问题:保存头指针后仅能访问首节点,无法遍历全链表求助
链表创建后只能访问第一个节点?看这里解决!
嘿,我明白你遇到的问题了——明明创建了多个节点,结果只能打出第一个的值,后面的都找不到对吧?先看看你代码里的核心问题,再给你修正方案。
首先,先还原你大概率没写完的创建逻辑(因为原代码没写完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
相关产品推荐
相关产品推荐

