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日

相关文章

  • Java数据结构之哈夫曼树概述及实现

    Java数据结构之哈夫曼树概述及实现 哈夫曼树概述 哈夫曼树(Huffman Tree),也称为最优树(Optimal Binary Tree),是一种带权路径长度最短的二叉树,也就是最小权重的前缀编码树。其基本思想是采用频率作为节点的权值,将频率较小的节点放在左子树上,频率较大的节点放在右子树上,从而形成一棵权值最小的二叉树。 实现过程 实现哈夫曼树需要以…

    数据结构 2023年5月17日
    00
  • JavaScript 处理树数据结构的方法示例

    下面是“JavaScript 处理树数据结构的方法示例”的完整攻略。 什么是树数据结构 树形数据结构是一种非常重要的数据结构,常被用于模拟现实中大量的层级结构。例如:文件目录、网站导航等。其是由一个根节点和若干个子节点构成的,每个节点可以有0个或多个子节点。 使用 JavaScript 处理树形数据结构 了解了树形数据结构后,我们可以使用 JavaScrip…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之插入排序示例详解

    Go语言数据结构之插入排序示例详解 什么是插入排序? 插入排序是一种简单直观的排序方法,其基本思想是将一个待排序的序列分成已排序和未排序两部分,从未排序的部分中选择一个元素插入到已排序部分的合适位置,直到所有元素都被插入到已排序部分为止。 插入排序示例 示例1 我们来看一个数字序列的插入排序示例: package main import "fmt&…

    数据结构 2023年5月17日
    00
  • 详解C语言实现空间索引四叉树

    详解C语言实现空间索引四叉树攻略 四叉树是一种常见的空间索引方法,可以有效地处理二维或三维空间中的数据。本攻略将详细介绍使用C语言实现空间索引四叉树的方法,包括数据结构的设计,插入和查询操作的实现。 数据结构设计 结点结构体 struct QuadtreeNode { int depth; // 结点深度 double x, y; // 结点中心坐标 dou…

    数据结构 2023年5月17日
    00
  • 详解Java中字典树(Trie树)的图解与实现

    详解Java中字典树(Trie树)的图解与实现 一、什么是字典树(Trie树) 字典树,又称为Trie树,是一种树形数据结构。常用于统计和排序大量的字符串。它支持快速插入和查找,并且可以用于词频统计。 二、字典树的基本性质 根节点不包含字符,除根节点外每个节点都只包含一个字符。 从根节点到某个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之队列

    带你了解Java数据结构和算法之队列 一、介绍 队列是已知的最古老和最常用的数据结构之一。它是一个线性结构,它遵循一个先进先出的原则,在日常生活中我们也很容易碰到队列。比如:在银行排队办理业务、队列中的电影厅、厨房中的菜单等等。 队列的操作主要有两种:入队(enqueue)和出队(dequeue)。插入操作只能在队尾进行,删除操作只能在队头进行。还有一些常用…

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历 前言 二叉树是数据结构中至关重要的一种数据结构,对于计算机科学的学习和工作都是至关重要的。而遍历二叉树是二叉树的重要操作之一。 为了帮助读者更好地理解二叉树前、中、后序遍历的过程,本文介绍 Java 数据结构中最清晰的图解二叉树前、中、后序遍历攻略。 什么是二叉树? 二叉树是一种非常重要的数据结构,它由根节点…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部