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

C++链表正数值节点复制功能异常,请求排查修复

问题分析与修复方案

首先,咱们直接揪出代码里的核心问题:你只创建了一个tmp节点,每次遇到正数值节点时都重复复用它,这会导致链表的指针被反复覆盖,最终整个链表结构完全混乱,才会出现{1,3,-4}这种错误结果。

具体错误拆解

原代码里的这段逻辑是问题根源:

Node* tmp = new Node(); 
// ...后续循环里重复修改这个tmp的data和next
tmp->data = current->data; 
tmp->next = current->next; 
current->next = tmp; 

第一次处理1时,tmp被挂在1后面,看起来没问题;但第二次处理3时,你直接把同一个tmp的data改成3、next指向-4,再把3的next指向这个tmp——这相当于把之前挂在1后面的节点直接替换成了3,同时打断了中间的链表链,最后只剩1→3→-4这条残缺的链。

另外,原代码里Node* current = new Node();这行完全是多余的,因为后面直接把current赋值为list->first,会造成内存泄漏,必须删掉。

修复后的完整代码

解决思路很简单:每次遇到正数值节点时,都要新建一个独立的tmp节点,而不是复用同一个。修复后的代码如下:

struct Node { int data; Node* next; }; 
struct List { Node* first; }; 

void duplicatePositiveNodes(List* list) { 
    Node* current = list->first; // 直接初始化,无需额外new
    while (current != nullptr) { 
        if (current->data > 0) { 
            // 每次处理正节点时,新建专属的tmp节点
            Node* tmp = new Node(); 
            tmp->data = current->data; 
            tmp->next = current->next; 
            current->next = tmp; 
            // 跳过新创建的节点,继续遍历下一个原节点
            current = current->next->next; 
        } else { 
            current = current->next; 
        } 
    } 
    Print(list->first); 
}

逻辑验证(以测试链表{1,0,-2,3,-4}为例)

  1. 处理1:新建值为1的tmp节点,挂在1后,链表变为1→1→0→-2→3→-4,current跳至0。
  2. 0不是正数,current跳至-2。
  3. -2不是正数,current跳至3。
  4. 处理3:新建值为3的tmp节点,挂在3后,链表变为1→1→0→-2→3→3→-4,current跳至-4。
  5. -4不是正数,循环结束,得到期望结果。

最后提醒一句:后续记得处理链表的内存释放,避免内存泄漏哦!

内容的提问来源于stack exchange,提问作者Skald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:22:56