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

如何编写单个通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:03:30