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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:10