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日

相关文章

  • C语言数据结构之动态分配实现串

    C语言数据结构之动态分配实现串 序言 在本文中,我们将探讨C语言中动态分配实现串的方法和技巧。本文将会从什么是动态分配串开始,详细介绍如何实现动态分配串,并给出一些示例代码帮助读者更好地理解。 什么是动态分配串 一个串(string)是由零个或多个字符组成的有限序列。串的实现可以分为两种形式:静态分配和动态分配。动态分配串是指在运行时动态地分配内存,以适应不…

    数据结构 2023年5月17日
    00
  • 字典树的基本知识及使用C语言的相关实现

    字典树的基本知识 字典树,英文名为Trie树,又称单词查找树或键树,是一种树形数据结构,用于表示关联数组或映射。它的优点是,可以大大减少无谓的字符串比较,查询效率比哈希表高。 字典树的核心概念是节点,每个节点包含一个字符和指向子节点的指针。根节点为空字符,每个字符串以一个独立的路径插入节点。如果一个字符串是另一个字符串的前缀,那么这个字符串的节点是另一个字符…

    数据结构 2023年5月17日
    00
  • c++ 数据结构map的使用详解

    c++ 数据结构map的使用详解 什么是map map是C++ STL中提供的一种用以存储键值对(key-value)的容器。它能够以平均O(log n)复杂度进行搜索、插入、删除操作,并且保持元素顺序,是一种比较高效的数据结构。 map的基本用法 定义map 定义map需要包含头文件<map>。 语法:map<key_type, valu…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之单链表深入理解

    Java数据结构与算法之单链表深入理解攻略 什么是单链表? 单链表(Singly Linked List)是指一个节点只指向下一个节点的链表。 单链表由多个节点组成,每个节点有两个属性:数据域和指针域。数据域保存节点的数据,指针域保存下一个节点的指针,因此每个节点包含两个域:data和next。 单链表的基本操作 单链表常用的基本操作包括: 在链表头部添加元…

    数据结构 2023年5月17日
    00
  • ES6新特性五:Set与Map的数据结构实例分析

    ES6新特性五:Set与Map的数据结构实例分析 ES6引入了Set和Map两种新的数据结构,可以帮助我们更方便地操作一些复杂的数据结构。本文将会分别介绍Set和Map的基本用法,并且提供一些实例说明,帮助大家更好地理解。 Set数据结构 基本用法 Set对象是一种无序的、无重复元素、容器类的数据结构。其基本用法如下: const set = new Set…

    数据结构 2023年5月17日
    00
  • Java数据结构之堆(优先队列)的实现

    Java 数据结构之堆(优先队列)的实现 什么是堆(优先队列) 堆(Heap)是一种数据结构,使用数组实现。堆分为小根堆和大根堆,大根堆满足父节点值大于子节点,小根堆则相反。堆通常被用来实现优先队列(Priority Queue)。 优先队列(Priority Queue)是一个能够让用户迅速查找到队列中最小值(或最大值)的抽象数据类型(ADT)。优先队列通…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之图的遍历(一)

    我来给您详细讲解一下“C语言数据结构与算法之图的遍历(一)”的完整攻略。 简介 本篇攻略主要介绍了图的遍历问题。图是由若干个点和连接这些点的边构成的数据结构,常用来表示复杂的关系和网络。图的遍历就是从图的某一点开始,按照一定的规则沿着边逐个访问图中所有的点,不重不漏地遍历整个图。 在本篇攻略中,我们将探讨图的深度优先遍历(DFS)和广度优先遍历(BFS)两种…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式

    带你了解Java数据结构和算法之前缀、中缀和后缀表达式 1. 前缀表达式(Prefix Expression) 前缀表达式是指运算符位于操作数之前的表达式,也被称为波兰式。前缀表达式的优点在于,每个运算符的优先级都可以通过括号来明确,不需要考虑运算符的优先级。同时,整个表达式的意义也可以很清晰地传达。 举个例子,下面是一个前缀表达式: + * 4 5 6 /…

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