为何链表print方法出现无限循环?与视频代码一致却异常
链表print方法无限循环问题排查
我参考YouTube视频实现了一个链表的print方法,代码和视频完全一致,但运行时出现无限循环,视频里的代码却正常。同事让我搜"ptrnull",我没搞懂;搜"brad"也找不到原因。我的代码如下:
#include <iostream> using namespace std; #define nl endl struct MyNode { int val; // value MyNode *next; // address }; class MyLinkedList { private : MyNode *head = NULL; int size = 0; public: void insertFirst(int val) { MyNode *node = new MyNode; node->val = val; // if the linked list is empty if (head == NULL) { head = node; } else { // the linked list is not empty node->next = head; head = node; } size++; } // to print all elements void print() { MyNode *temp = head; while (temp != NULL) { cout << temp->val << nl; temp = temp->next; } } int getSize() { return size; } }; int main() { MyLinkedList list1; list1.insertFirst(1); list1.insertFirst(2); list1.insertFirst(3); list1.insertFirst(4); cout << list1.getSize() << nl; list1.print(); return 0; }
问题原因
核心问题是新创建的MyNode结构体的next指针未初始化:
- 用
new MyNode创建节点时,只会分配内存,不会自动把next设为NULL,它会是一个随机的垃圾值。 - 插入第一个节点时,
head指向这个节点,但它的next不是NULL;后续插入的节点的next虽然指向了前一个节点,但链表的最后一个节点(也就是第一个插入的1)的next是垃圾值,不是NULL。 - 执行
print方法时,temp遍历到最后一个节点后,temp->next不是NULL,循环会继续访问无效内存,陷入无限循环。
解决方案
有两种简单的修复方式:
方式1:创建节点时手动初始化next指针
修改insertFirst方法里的节点创建部分:
MyNode *node = new MyNode; node->val = val; node->next = NULL; // 新增这行,手动初始化next为NULL
方式2:给MyNode结构体添加构造函数
让结构体创建时自动初始化成员,避免遗漏:
struct MyNode { int val; MyNode *next; // 构造函数 MyNode(int value) : val(value), next(NULL) {} };
同时修改insertFirst里的节点创建代码:
MyNode *node = new MyNode(val); // 直接用构造函数初始化
两种方式都能确保链表的最后一个节点的next是NULL,print方法的循环会正常终止。
内容的提问来源于stack exchange,提问作者Mostafa Abdelfatah
相关产品推荐
相关产品推荐

