双向链表 图示
双向链表是一种链式数据结构,它与单向链表类似,但每个节点有两个指针,一个指向前一个节点,一个指向后一个节点,这样,我们可以在双向链表中双向遍历。双向链表的优点是,可以在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、结论双向链表在大多数时候与单向列表具有类似的行为。但是,在某些情况下,双列表的性能优于单链表。与单链表相比,双链表中的插入和删除操作更容易、更高效。但是,以程序的额外空间为代价,它们更容易。
继续肝~~~~
近期下雪,希望各位读者注意保暖,注意身体。新年快乐~~~
新年快乐