为什么我的链表仅输出一个值?代码问题排查求助
链表仅显示第一个节点的问题修复
你的问题出在insert_node函数的else分支,这段代码完全搞错了链表尾节点的更新逻辑:
else { tail = new_node; tail->next = new_node; }
错误原因:
- 直接将
tail替换为新节点,没有把原来的尾节点和新节点建立连接,导致除第一个节点外,其他节点都没有被加入到链表中 - 让新节点的
next指向自己,形成自循环,对链表遍历毫无意义反而会引发异常
修正后的insert_node函数:
void insert_node(int value) { Node *new_node = new Node(); new_node->n = value; new_node->next = NULL; if (head == NULL) { head = new_node; tail = new_node; } else { // 先把原尾节点的next指向新节点,完成链表连接 tail->next = new_node; // 再更新tail为新节点,标记新的链表尾部 tail = new_node; } }
完整修正代码:
#include <iostream> using namespace std; struct Node { int n; Node *next; }; class LinkedList { private: Node *head; Node *tail; public: LinkedList() { head = NULL; tail = NULL; } // 补充析构函数,避免内存泄漏 ~LinkedList(){ Node *current = head; while(current != NULL){ Node *temp = current; current = current->next; delete temp; } head = NULL; tail = NULL; } void insert_node(int value) { Node *new_node = new Node(); new_node->n = value; new_node->next = NULL; if (head == NULL) { head = new_node; tail = new_node; } else { tail->next = new_node; tail = new_node; } } void show() { Node *current = head; while (current != NULL) { cout << current->n << endl; current = current->next; } } }; int main() { LinkedList L; L.insert_node(1); L.insert_node(2); L.insert_node(4); L.insert_node(8); L.show(); return 0; }
额外说明:
- 原代码缺少
<iostream>头文件和using namespace std;,否则cout无法正常编译 - 原析构函数为空,会导致内存泄漏,这里补充了遍历链表逐个删除节点的逻辑
- 将
show函数里的临时变量名改为current,比new_node更清晰,避免和插入函数的新节点变量混淆
内容的提问来源于stack exchange,提问作者asvalk1672
相关产品推荐
相关产品推荐

