如何编写单个通用Append函数创建多个链表?
用单个Append函数创建多个链表
目前我需要用两个相似的函数创建两个链表,想知道能不能只用一个函数创建任意数量的链表?我试过把
struct Node **p和struct Node *p作为函数参数但没成功,需要实现的是Append(尾插)函数,不是指定插入位置的插入函数。
核心解决方案:使用二级指针传递链表头
问题的关键在于:当链表为空时,需要修改外部头指针的指向(从nullptr改为新节点),如果只传一级指针,函数内的修改不会影响外部变量,因此必须用二级指针(指针的指针)来传递头指针。
高效版(带尾指针跟踪,避免遍历)
这个版本和你原来的Append_1/Append_2逻辑完全一致,只是把固定的first/second换成可传递的参数,同时单独维护每个链表的尾指针,避免每次尾插都遍历链表:
#include <iostream> using namespace std; struct Node { int data = 10; struct Node *next; } *first, *second, *third; void Display(struct Node *p) { while (p) { cout << p->data << " "; p = p->next; } cout << "\n"; } // 尾插函数:传入链表头指针的指针、尾指针的指针,以及要插入的元素 void Append(struct Node **head, struct Node **tail, int elem) { Node* t = new Node; t->data = elem; t->next = nullptr; if (*head == nullptr) // 链表为空时,头和尾都指向新节点 *head = *tail = t; else { (*tail)->next = t; // 注意括号优先级:-> 高于 * *tail = t; } } int main() { // 为每个链表单独维护尾指针 struct Node *last1 = nullptr, *last2 = nullptr, *last3 = nullptr; // 操作第一个链表 Append(&first, &last1, 3); Append(&first, &last1, 7); Display(first); // 操作第二个链表 Append(&second, &last2, 10); Append(&second, &last2, 14); Append(&second, &last2, 21); Display(second); // 操作第三个链表(新增) Append(&third, &last3, 5); Append(&third, &last3, 9); Display(third); return 0; }
简化版(无需维护尾指针,适合短链表)
如果觉得维护尾指针麻烦,可以每次尾插时遍历到链表尾部,这样只需要传头指针的二级指针即可,代码更简洁但效率稍低:
// 简化版尾插函数:无需尾指针,每次遍历到尾部 void Append(struct Node **head, int elem) { Node* t = new Node; t->data = elem; t->next = nullptr; if (*head == nullptr) { *head = t; return; } // 遍历到最后一个节点 Node* p = *head; while (p->next != nullptr) p = p->next; p->next = t; } // 调用示例 int main() { Append(&first, 3); Append(&first, 7); Display(first); Append(&second, 10); Append(&second, 14); Display(second); return 0; }
关键说明
- 二级指针的作用:让函数能够修改外部的头指针变量(比如从
nullptr变成新节点的地址)。 - 带尾指针的版本效率更高,因为不需要每次遍历整个链表;简化版更适合链表长度较短的场景。
内容的提问来源于stack exchange,提问作者Cap10
相关产品推荐
相关产品推荐

