数据结构之双向链表:连接数据的桥梁

编程探索课程 2024-03-02 07:09:17
1、什么是双向链表

双向链表 图示

双向链表是一种链式数据结构,它与单向链表类似,但每个节点有两个指针,一个指向前一个节点,一个指向后一个节点,这样,我们可以在双向链表中双向遍历。双向链表的优点是,可以在O(1)时间内删除或插入节点,但需要更多的内存空间来存储指向前一个节点的指针。

2、双向链表的表示形式

双向链表是指链表中每个结点都有两个指针域,一个指向后继结点,一个指向前驱结点。

双向链表 logo

代码如下所示:

#include <stdio.h>#include <stdlib.h>typedef int status;typedef int ElemType;// 链表结点及链表数据表示定义// 双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点typedef struct DualLinkListNode { ElemType data; struct DualLinkListNode *prior; struct DualLinkListNode *next;} DualLinkListNode, *DualLinkListList;// 初始化操作,初始化时两个指针都指向其自身int InitDualLinkListList(DualLinkListList &l) { puts("正在初始化。。。。。"); l = (DualLinkListList)malloc(sizeof(struct DualLinkListNode)); if (l == NULL) { exit(-1); } l->prior = l->next = l; return 1;}3、双向链表插入

开头插入

开头插入

中间插入

中间插入

尾部插入

尾部插入

插入时间复杂度:

插入时间复杂度

4、双向链表删除

开头删除

开头删除

中间删除

中间删除

尾部删除

尾部删除

删除操作的时间复杂度:

删除时间复杂度

5、双向链表的优点

可以在正向和向后两个方向上遍历双向链表。

反向遍历使删除操作更有效率。如果给出了一个节点的指针,可以很容易地删除前一个节点,其时间复杂度为 O(1)。

插入操作也更有效率。如果指针给定了一个节点,可以轻松地在该节点之前插入一个节点。

6、双向链表的缺点

双向链表比单个列表占用更多的空间,因为每个节点上都存在一个额外的“上一个”指针。

需要在执行所有操作时维护这个额外的“上一个”指针。这增加了在双向链表上执行的所有操作的空间复杂性。

7、双向链表的使用场景

双向链表在以下场景中使用比较多:

实现栈和队列:可以利用双向链表的特性来快速实现栈(先进后出)和队列(先进先出)的数据结构。

缓存系统:在缓存系统中,双向链表可以用于管理缓存项的插入和删除,以提高缓存的效率。

图形界面:在图形界面中,双向链表可以用于表示节点之间的关系,如树状结构或网状结构。

文件系统:文件系统中的目录结构可以用双向链表来表示,方便进行文件和目录的操作。

数据库管理:在数据库中,双向链表可以用于管理数据记录的顺序,例如实现排序或索引。

Mysql 索引 B+树 叶子结点 双向链表

操作系统:操作系统中的进程调度、内存管理等模块可能会使用双向链表来组织相关数据。

Linux 内核使用双向链表

8、结论

双向链表在大多数时候与单向列表具有类似的行为。但是,在某些情况下,双列表的性能优于单链表。与单链表相比,双链表中的插入和删除操作更容易、更高效。但是,以程序的额外空间为代价,它们更容易。

继续肝~~~~

近期下雪,希望各位读者注意保暖,注意身体。新年快乐~~~

新年快乐

0 阅读:0

编程探索课程

简介:感谢大家的关注