C++超详细讲解单链表的实现

首先我们来了解一下单链表的概念。

单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。

实现单链表

首先,我们需要定义一个节点结构体,表示单链表的每一个节点。它包括一个存储数据的元素和一个指向下一个节点的指针。

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

接着,我们需要定义一个链表类 LinkedList,用于实现单链表操作:

class LinkedList {
public:
    LinkedList() : head(nullptr) {}

    void add(int val);  // 添加元素
    bool remove(int val);  // 删除元素
    void display();  // 打印链表

private:
    ListNode* head;  // 链表头节点
};

我们通过 LinkedList 类提供的接口 addremovedisplay 来操作单链表。

add 函数用于向链表中添加节点。当链表为空时,需要创建新的头节点。当链表不为空时,需要遍历到尾节点,然后将节点添加到链表尾部。

void LinkedList::add(int val) {
    ListNode* node = new ListNode(val);
    if (!head) {
        head = node;
    } else {
        ListNode* cur = head;
        while (cur->next) {
            cur = cur->next;
        }
        cur->next = node;
    }
}

remove 函数用于删除链表中的节点。需要遍历链表,查找到对应的节点,然后将其从链表中删除。

bool LinkedList::remove(int val) {
    ListNode dummy(0);
    dummy.next = head;
    ListNode* cur = &dummy;
    while (cur->next) {
        if (cur->next->val == val) {
            cur->next = cur->next->next;
            return true;
        }
        cur = cur->next;
    }
    return false;
}

display 函数用于打印链表中的元素。需要遍历链表,将元素依次输出。

void LinkedList::display() {
    ListNode* cur = head;
    while (cur) {
        std::cout << cur->val << "->";
        cur = cur->next;
    }
    std::cout << "null\n";
}

示例说明

我们可以使用以下代码来测试单链表的实现:

int main() {
    LinkedList list;

    // 添加节点
    list.add(1);
    list.add(2);
    list.add(3);

    // 打印链表
    list.display();  // output: 1->2->3->null

    // 删除节点
    list.remove(2);

    // 打印链表
    list.display();  // output: 1->3->null

    return 0;
}

在这个示例中,我们创建了一个 LinkedList 对象,然后向链表中添加节点,并使用 display 函数打印链表。接着,我们删除了节点 2,并再次使用 display 函数打印链表,可以看到节点 2 已经被删除了。

另外一个示例是,我们可以使用单链表来计算两个数字的和。具体实现可以参考以下代码:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode dummy(0);
    ListNode* cur = &dummy;
    int carry = 0;
    while (l1 || l2 || carry) {
        int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
        carry = sum / 10;
        cur->next = new ListNode(sum % 10);
        cur = cur->next;
        if (l1) l1 = l1->next;
        if (l2) l2 = l2->next;
    }
    return dummy.next;
}

这个函数接收两个链表作为参数,并返回它们的和的链表。在函数内部,我们使用了循环来遍历链表节点,对节点上的值进行求和,然后将结果存储在新的链表节点上。需要注意的是,如果当前节点为空,我们需要将其值置为 0。

以上就是 C++ 实现单链表的详细攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++超详细讲解单链表的实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月19日
    00
  • Java队列数据结构的实现

    下面是实现Java队列数据结构的完整攻略。 Java队列数据结构的实现 1. 概述 队列是一种常用的线性数据结构,是“先进先出”(FIFO)的一种数据结构。队列通常具有两个操作:入队和出队,它们分别对应着在队列尾添加元素和在队列头删除元素的操作。 在Java中,有多种方式可以实现队列数据结构,本文将讲解两种常用的实现方式:基于数组的实现和基于链表的实现。 2…

    数据结构 2023年5月17日
    00
  • Unity接入高德开放API实现IP定位

    Unity接入高德开放API实现IP定位攻略 本文将详细介绍如何在Unity中接入高德开放API实现IP定位功能。 准备工作 在开始之前,需要准备以下内容: 高德开放平台账号 Unity集成开发环境 一台联网的电脑或手机 开始集成 1. 创建Unity项目 首先,我们需要在Unity中创建一个新的项目。 2. 导入AMap3D SDK 将下载好的AMap3D…

    数据结构 2023年5月17日
    00
  • 数据结构 数组顺序存储详细介绍

    数据结构数组顺序存储详细介绍 什么是数组顺序存储? 数组是最基本的数据结构之一,在计算机程序中使用广泛。在数组中,存储的元素类型相同且占用相同的内存空间,可以通过下标进行快速访问和修改。数组可以使用不同的方法来存储在内存中,其中最简单的方法是数组顺序存储。 数组顺序存储是指将元素按照顺序依次存储在内存中的一块连续地址中,可以方便地进行随机访问。这种方式与链式…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘四 双向链表

    C#数据结构与算法揭秘四 双向链表 简介 本文将讲解如何在C#中实现双向链表。双向链表是一种常用的数据结构,在许多算法中都有广泛应用,它提供了与单向链表不同的灵活性和便利性。 双向链表的实现 创建一个双向节点 双向链表由节点(Node)组成。一个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。由于这两个指针都可能为null,所以我们将它们声明为可空…

    数据结构 2023年5月17日
    00
  • JavaScript队列数据结构详解

    JavaScript队列数据结构详解 本文将为大家详细讲解JavaScript队列数据结构的相关知识。 什么是队列数据结构 队列是一种线性数据结构,它只允许在队列的两端进行插入和删除操作。在队列中,新元素插入到队列的末尾,也称为队尾。而删除操作则是从队列的前面删除元素,也称为队首。 将元素插入队列的操作称为入队,将元素删除队列的操作称为出队。除此之外,还有一…

    数据结构 2023年5月17日
    00
  • 实际问题中用到的算法——递归算法确定插帧顺序

    问题: 现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做 4 倍(或者更高的 8,16 倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入 3 帧,即:假设插帧前视频帧序号是 0,4,8,12…,则插帧时补充相邻帧跨过的 3 个序号,得到插帧后的视频帧序号为 0,1,2,3,4,5,6,.. 即可…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部