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

yizhihongxing

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

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

相关文章

  • 数据结构中的各种排序方法小结(JS实现)

    数据结构中的各种排序方法小结(JS实现) 本文将介绍常见的八种排序算法: 冒泡排序 插入排序 选择排序 快速排序 归并排序 堆排序 希尔排序 计数排序 下面进行详细讲解。 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历数组,比较相邻的两个元素,并按大小交换位置,一直到整个数组排序完成。它的时间复杂度为O(n^2)。 示例代码: function bub…

    数据结构 2023年5月17日
    00
  • Mysql 数据库结构及索引类型

    好的。首先,我们需要了解 Mysql 数据库的基本结构和索引类型。 Mysql 数据库结构 Mysql 数据库包含多个数据库,每个数据库包含多个数据表,每个数据表包含多个数据记录(或者叫行)。关键的概念包括数据库、数据表、数据记录以及 Mysql 列类型等。 数据库 Mysql 数据库是一个命名的容器,用于存储和管理相关数据表。可以使用以下 SQL 代码来创…

    数据结构 2023年5月17日
    00
  • redis中的数据结构和编码详解

    Redis中的数据结构和编码详解 Redis中的数据结构 Redis支持以下五种数据结构: 字符串(string):最基本的数据类型,Redis中的字符串是二进制安全的,意味着您可以在字符串中存储任何数据。例如,您可以将图像文件或序列化对象存储为Redis字符串。字符串最大可以容纳512MB。 列表(list):Redis列表是字符串列表,其中的元素按照插入…

    数据结构 2023年5月17日
    00
  • 一文带你走进js数据类型与数据结构的世界

    一文带你走进JS数据类型与数据结构的世界 一、JS数据类型 1. 原始类型 JS中原始类型包括:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。 其中Undefined和Null分别代表未定义和空值,Boolean表示布尔值,Number表示数字,String表示字符串,Symbol是ES6新增的一种基础…

    数据结构 2023年5月17日
    00
  • C语言实现学生信息管理系统(链表)

    C语言实现学生信息管理系统(链表) 简介 学生信息管理系统是管理学生的一种系统,可以实现添加、查找、删除和修改学生信息等功能。本文将使用C语言实现学生信息管理系统,并通过链表的方式进行实现。 前提条件 在开始之前,我们需要了解如下内容: C语言基础知识 链表的基本概念和使用 系统架构 学生信息管理系统主要包含以下几个模块: 学生信息结构体 添加学生信息 查找…

    数据结构 2023年5月17日
    00
  • 稀疏数组

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

    算法与数据结构 2023年4月19日
    00
  • Java数据结构之二叉排序树的实现

    Java数据结构之二叉排序树的实现 二叉排序树(Binary Sort Tree)是一种特殊的二叉树结构,它的每个结点都包含一个关键字,并满足以下性质: 左子树中所有结点的关键字都小于根结点的关键字; 右子树中所有结点的关键字都大于根结点的关键字; 左右子树也分别为二叉排序树。 这种结构有助于实现快速的查找、插入和删除操作。在此,我们将展示一种实现二叉排序树…

    数据结构 2023年5月17日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

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