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

C++ merge合并Doubly Linked List后如何将入参的两个双向链表置空

问题核心原因

你当前函数的DLinkedList a、DLinkedList b是值传递,函数内部的a、b只是外部实参的拷贝,修改这两个拷贝完全不会影响外部的原始链表,这是你无法置空入参的根本原因。

修复方案

1. 修改函数签名,改为引用/指针传递

根据你使用的语言选择对应写法:

  • C语言(无引用语法):改为传递链表指针
// 修改后的函数签名
void merge(DLinkedList* a, DLinkedList* b)
  • C++:可以直接用左值引用
// 修改后的函数签名
void merge(DLinkedList& a, DLinkedList& b)

2. 合并完成后释放入参链表内存、置空链表

你当前的实现只是把a、b的节点值复制插入到当前链表,原a、b的节点还占用堆内存,需要先释放再置空,避免内存泄漏。
完整代码示例(C版本为例):

void merge(DLinkedList* a, DLinkedList* b)
{
    // 原有合并逻辑保持不变,注意取值用->
    DNode* atemp = a->header;
    DNode* btemp = b->header;
    while(atemp != NULL)
    {
        insertOrderUnique(atemp->data);
        atemp = atemp->next;
    }
    while(btemp != NULL)
    {
        insertOrderUnique(btemp->data);
        btemp = btemp->next;
    }

    // 新增:释放a链表的所有节点,置空a
    DNode* curr = a->header;
    while(curr != NULL) {
        DNode* next = curr->next;
        free(curr);
        curr = next;
    }
    a->header = NULL;
    a->tail = NULL;
    a->length = 0; // 如果你的链表结构体有长度字段就加这行

    // 新增:释放b链表的所有节点,置空b
    curr = b->header;
    while(curr != NULL) {
        DNode* next = curr->next;
        free(curr);
        curr = next;
    }
    b->header = NULL;
    b->tail = NULL;
    b->length = 0;
}

调用的时候对应传地址即可:merge(&listA, &listB);

优化提示

如果你已经为DLinkedList封装了clear()、destroy()这类清理方法,直接调用对应方法即可,不需要重复写释放节点的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:27:00