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
相关产品推荐
相关产品推荐

