首页 > 其他分享 >【数据结构】链式型存储结构-双向链表

【数据结构】链式型存储结构-双向链表

时间:2023-04-30 21:24:18浏览次数:32  
标签:结点 跳表 单链 链式 链表 查找 双向 数据结构

1  前言

只要大家坐过火车,对于双向链表的理解就相当简单。双向链表就是在单链表的基础之上,为每一个结点增加了它的前继结点,我们来看看。

2  双向链表

双向链表的定义如下:

typedef struct DaulNode
{
    ElemType data;
    struct DaulNode *prior;  //前驱结点
    struct DaulNode *next;   //后继结点
}DaulNode, *DuLinkList;

下图可以更直观地反映双向链表的形式:

单链表存在循环链表,双向链表也有循环链表:

3  双向链表的操作

3.1  双向链表的插入

插入操作其实并不复杂,不过顺序很重要,千万不要写反了。

3.2  双向链表的删除

双向链表相对于单链表来说,是更复杂一些,每个结点多了一个prior指针,对于插入和删除操作的顺序一定要格外小心,就像你的 “求生欲”。双向链表可以有效提高算法的时间性能,说白了就是用空间来换取时间。

4  引申

我们趁着链式结构的最后一篇,引申一个链式结构有关的跳表,在解释跳表之前,先看一个简单的有序单链表:

对于上面这个有序单链表,我们查找一个元素的平均时间复杂度为O(n),那么是否有一种更快的方式查找元素呢?

答案是肯定的啦!我们可以通过在原始链表的基础之上,为其增加索引来解决这个问题,如下图:

我们以查找元素 6 为例,当我们在原始链表(Normal Line)上进行查找,将需要从头结点开始依次遍历直至找到值为6的结点;当我们在一级索引(Express Lane)上进行查找,将只需要从1->3->5->6,就可以找到元素6。相当于之前查找步数的一半,速度提升了一倍,那我们是否可以更快呢,当然可以,我想你已经想到啦!

通过上图可以发现,从二级索引开始,我们仅需要1->5->6,进一步的提升了查找的效率。

注意:跳表只能用于元素有序的情况

所以跳表对标的是平衡树和二分查找,是一种 插入/删除/搜索 都是O(log n) 的数据结构。

可以看到跳表也是类似拿空间换时间的,跳表的查询时间复杂度为O(log(n)),空间复杂度为O(n)。它最大的优势是原理简单、容易实现、方便扩展、效率更高。因此,在一些热门的项目里用来代替平衡树,如Redis、LevelDB 等。

5  小结

好了,双向链表我们就看到这里哈,有理解不对的地方欢迎指正哈。

标签:结点,跳表,单链,链式,链表,查找,双向,数据结构
From: https://www.cnblogs.com/kukuxjx/p/17365775.html

相关文章

  • 【数据结构】链式型存储结构-循环单链表
    1 前言对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这样一来,不从头结点出发,这样就无法访问到全部结点。为了解决这个问题,我们只需要将单链表的尾结点的指针由空指针改为指向头结点......
  • 【数据结构】链式型存储结构-静态链表
    1 前言地球人都知道C语言是个伟大的语言,它的魅力在于指针的灵活性,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。(面向对象语言,比如java,可以使用对象引用机制间接地实现指针的某些功能)但是古人还是木有C语言丫,木有JAVA丫,只有原始的Basic,Fortran等......
  • 【数据结构】链式型存储结构-单链表
    1 前言线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置。比起顺序存储结构每个元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据信息外,还要存储它的后继元素的存储地址(指针)。也就是说......
  • 【数据结构】线性表分类以及顺序型存储结构
    1 什么是线性表线性表的定义:由零个或多个数据元素组成的有限序列首先它是一个序列,也就是说元素之间是有先来后到之分。若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。线性表强调是有限的,事实上无论计算机发展到多强大,他所能处理......
  • 数据结构与算法基础复习--(1)
    基本术语1.数据(Data)数据是能输入计算机且能被计算机处理的各种符号的集合信息的载体是对客观事物符号化的表示能够被计算机识别、存储和加工包括:数值型的数据:整数、实数等非数值型的数据:文字、图像、图形、声音等2.数据元素数据元素是数据的基本单位,在计......
  • c#-单链表
    namespaceMyLink;publicclassMyLinkedList{privateint_size{get;set;}publicclassMyTreeNode{publicintval{get;set;}publicMyTreeNodenext{get;set;}publicMyTreeNode(intval){this.val=val;......
  • C语言链式存储(使用引用传递)
    #include<stdio.h>#include<stdlib.h>typedefstructLinkNode{ intdata; structLinkNode*next;}LinkNode;typedefstructLink{ LinkNode*front,*rear;//frontrear为链表的伴随指针}LinkQueue;voidInitQueue(LinkQueue&Q){Q.front=Q.rear......
  • c语言创建队列的链式存储
    #include<stdio.h>#include<stdlib.h>typedefstructLinkNode{intdata;structLinkNode*next;}LinkNode;typedefstructLink{LinkNode*front,*rear;//frontrear为链表的伴随指针}LinkQueue;//初始化voidInitQueue(LinkQueue*......
  • 数组模拟实现数据结构
    数组模拟链表实现①单链表:邻接表(存储图和树)②双链表:优化某些问题单链表inte[N]存储val,intne[N]存储next//单链表模板inthead,e[N],ne[N],idx;//head表示头节点的下标,e[i]表示节点i的值,ne[i]表示节点i的指针是多少,idx存储当前已经用到了哪个点v......
  • 【Redis】Redis数据结构——链表
    【Redis】Redis数据结构——链表注意事项:本文第三点redis中操作列表的相关命令可参考博文:【Redis】Redis基础命令集详解_Etui۹(・༥・´)و̑̑的博客本文参考内容如下:1、Redis数据结构——链表-随心所于-2、《Redis设计与实现》(黄健宏·著)第3章链表本文仅供学习交流使用!1、Redi......