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

C++单链表replace函数问题排查:替换指定值为多个1节点

排查SinglyLinkedList的replace函数问题

问题背景

我正在实现C++中的SinglyLinkedList类,类维护链表的head、tail指针以及记录节点数的size变量。目标是实现replace(int x)函数:将链表中每个值为x的节点替换为x个值为1的节点。例如原链表为4 -> 5 -> 3 -> 8 -> 5,调用replace(3)后,预期结果为4 -> 5 -> 1 -> 1 -> 1 -> 8 -> 5;若x不存在于链表中,则链表保持不变。

类接口定义:

struct SinglyLinkedList
{
    Node* head, * tail;
    int size;

    SinglyLinkedList() :head(nullptr), tail(nullptr), size(0) {}; // Default constructor
  
    void replace(int X);
};

我的实现代码:

void SinglyLinkedList::replace(int X)
{
    Node dummyHead(0, head);
    Node* curr = head, * prev = &dummyHead;
    while (curr)
    {
        if (curr->value == X)
        {
            Node* nextNode = curr->next;
            for (int i = 0; i < X; i++)
            {
                prev->next = new Node(1);
                size++;
                prev = prev->next;
            }
            if (curr == tail)
            {
                tail = prev;
            }
            prev->next = nextNode;
            curr = nextNode;
        }
        else
        {
            prev = curr;
            curr = curr->next;
        }
    }
    head = dummyHead.next;
}

我的实现思路是遍历链表,维护当前节点curr和前驱节点prev,找到值为x的节点时插入x个值为1的新节点;使用哑节点简化头部替换逻辑,同时更新size。但测试中发现函数存在问题,希望排查问题,比如tail的更新逻辑是否有疏漏?


问题排查与修正

1. 内存泄漏问题

当前代码中,找到值为X的节点后,只是跳过了该节点,但没有释放其内存,会造成内存泄漏。需要在处理完替换逻辑后,调用delete curr释放原节点。

2. size计算错误

原逻辑只对新增的x个节点执行了size++,但没有减去被替换掉的那个节点的计数。正确的逻辑应该是:先size--(移除原节点),再新增x个节点时执行x次size++。例如原链表有一个值为3的节点,size为5,替换后size应为5-1+3=7,但原代码会得到5+3=8,与实际节点数不符。

3. tail更新逻辑的验证

当前的tail更新逻辑是正确的:当被替换的节点是原链表的tail时,将tail指向最后一个新增的1节点(即prev),这符合预期。除非X=0(但题目场景中X应为正整数,无需额外处理)。

修正后的代码

void SinglyLinkedList::replace(int X)
{
    Node dummyHead(0, head);
    Node* curr = head, * prev = &dummyHead;
    while (curr)
    {
        if (curr->value == X)
        {
            Node* nextNode = curr->next;
            // 减去被替换的原节点计数
            size--;
            // 插入X个值为1的节点
            for (int i = 0; i < X; i++)
            {
                prev->next = new Node(1);
                size++;
                prev = prev->next;
            }
            // 更新tail(如果原节点是tail)
            if (curr == tail)
            {
                tail = prev;
            }
            prev->next = nextNode;
            // 释放原节点内存
            delete curr;
            curr = nextNode;
        }
        else
        {
            prev = curr;
            curr = curr->next;
        }
    }
    head = dummyHead.next;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:00:57