如何在C++中实例化LeetCode ListNode结构体及解决相关使用问题
问题解答
1. 无限输出的核心问题
你的输出函数存在逻辑错误:list_input->next;这行代码仅读取了当前节点的next指针值,没有将其赋值给循环变量list_input,导致循环过程中list_input永远指向传入的第一个节点,循环条件永远为真,就会持续输出第一个节点的val值。
正确的输出函数写法如下:
void ListNode_output(ListNode * list_input) { while(list_input){ cout << list_input->val << ' '; // 移动指针到下一个节点 list_input = list_input->next; } cout << endl; }
另外你第一次创建链表的顺序是反的:你代码中p1_2的next指向p1_1,p1_3的next指向p1_2,实际生成的链表是3->4->2,如果要得到2->4->3的链表,应该调整指向关系为:p1_1.next = &p1_2,p1_2.next = &p1_3。
2. ->和.运算符的区别
C++中访问结构体/类成员的规则非常明确:
- 如果变量是结构体本身的实例,直接用
.运算符访问成员,比如你第一次创建的p1_1是ListNode实例,就可以用p1_1.val拿到值 - 如果变量是指向结构体的指针,需要先解引用指针拿到实例,再用
.访问,也就是(*list_input).val,为了简化写法,C++提供了->运算符,等价于解引用+访问成员,因此list_input->val和(*list_input).val效果完全一致。你传入输出函数的是ListNode*类型的指针,因此必须用->访问成员。
3. 更简便的链表创建方式
你可以直接复用ListNode提供的构造函数简化创建逻辑,不需要单独给val和next赋值,创建2->4->3的链表可以简化为:
// 从后往前创建,直接把后一个节点的指针传入前一个节点的构造函数 ListNode* l1_3 = new ListNode(3); ListNode* l1_2 = new ListNode(4, l1_3); ListNode* l1_1 = new ListNode(2, l1_2);
如果本地测试需要频繁创建链表,还可以封装一个通用的构造工具函数:
ListNode* buildList(const vector<int>& vals) { ListNode* dummy = new ListNode(); ListNode* cur = dummy; for (int v : vals) { cur->next = new ListNode(v); cur = cur->next; } return dummy->next; }
使用时只需一行代码即可生成目标链表:
ListNode* head = buildList({2,4,3});
注意:用new关键字创建的堆内存节点,使用完后需要手动delete释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

