首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【数据结构】-----双链表(小白必看!!!)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域. https://blog.csdn.net/bhbcdxb123...今天我们更新了双链表内容, 欢迎大家关注点赞收藏⭐️留言 什么是双链表? 双链表的定义  为什么引入双链表?  ...单链表的结点中只有一个指向其后继的指针,使得单链表要访问某个结点的前驱结点时,只能从头开始遍历,访问后驱结点的复杂度为O(1),访问前驱结点的复杂度为O(n)。为了克服上述缺点,引入了双链表。  ...双链表的结点中有两个指针prior和next,分别指向前驱结点和后继结点。  ...啥时候用啥时候换。 然后用LTNode代替struct ListNode,这样更方便一些。 双链表上的操作: 1.1双链表的初始化: 在初始化之前,我们这里先说一下如何创建一个新节点。

9610

数据结构——双链表详解(超详细)

正文: 1.概念和结构 在前面的博客中小编讲述了单链表,其实单链表的全程叫做,单向不带头不循环链表,这里有很多读者朋友就好奇了,单向和不循环还是比较容易理解的,那么不带头又是什么意思呢,其实这里就牵扯到了一个全新的知识点...,在写双链表代码的时候要比单链表要简单许多,等会各位就清楚小编为什么这么说了,它的最后一个特点是循环,这个小编在之前讲解环形链表习题的时候就牵扯到了一点循环链表,下面小编给上双链表的结构图以便大家在等会写代码的时候可以更好的理解...对于插入操作,肯定需要先设置一个新的结点,不然尾插就没有什么结点可插了,对于新节点的创建,小编在之前单链表也写过,不过双链表与单链表最大的不同就是它的下一个结点和上一个结点都要去指向自己,下面直接上手代码图了...2.3.双链表的打印 双链表的打印其实是蛮容易的,不过写这个函数的目的就是为了测试其他函数写的对不对,对于双链表的打印,它和单链表的打印有些许不同,因为双链表我·是一个带头的,死循环的链表,所以我们需要通过控制循环条件来实现对于双链表的打印...对于双链表的销毁,对比于单链表,双链表的销毁是有点麻烦的,不过麻烦程度是比较小的,我们这里也是用到了循环,我们需要把双链一个一个的进行销毁,此时需要注意的是,我们对哨兵位做出了改变,所以需要传双指针,此时我们可以用一个指针记录哨兵位

18710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【数据结构】栈的概念、结构和实现详解

    实现栈的底层方法选择 没有规定栈的哪端是栈顶,只说了数据插入和删除的一端是栈顶,所以我们栈的底层实现可以用链表或者数组 。...虽然数组和单链表都可以实现栈,但是单链表能很好入数据不好删除数据,这里单链表要删除数据就是尾删,尾删需要找到前一个结点,不是很方便。...非要用链表的话有两个解决方法,1.可以用双向链表 2.我们把单链表的头节点当作栈顶,也就是把左边当栈顶,右边当栈底,对单链表进行头插和头删的操作。...现在有3种方法实现栈,数组,单链表,双链表,我们应该如何选? 首先排除双链表,用双链表不如用单链表,双链表因为一个节点存两个指针,比单链表的一个节点多了4个字节或者8个字节。...数组实现栈和单链表实现栈有什么区别?基本没区别,都可以,非要说选一个,我们还是更倾向于数组,因为数组的唯一缺点就是内存不足时需要扩容,扩容的影响也不是特别大,最重要的是数组的缓存效率更高。

    14410

    数据结构之双向链表(赋源码)

    本篇所述:带头双向循环链表,简称双链表,双链表和单链表(不带头单向不循环链表)是八种链表中常用的两个链表, 双向链表 双链表结构 双链表是一个带头双向循环链表,更据它的特性不能想出,在一个双链表的一个节点里它的指针域用来存放前一个节点的地址和存放下一个节点的地址...首先、在打印单链表时,同样使用了循环,创建了一个临时指针来指向第一个节点,打印单链表数据的接收条件是pcur指向空时停止。而双链表是一个循环链表它没有一个节点的指针是指向空的。...,就是只有一个头节点,这时双链表被看作是空链表,这与前文实现的单链表不同,单链表是需要将所有节点删除才为空,因为它没有头节点,这才将所有节点删除。...销毁: 在进行销毁时需要创建一个临时变量用来遍历所有节点进行销毁,这里销毁的逻辑与单链表的销毁的逻辑时一样的,然后再循环内遍历销毁时需要使用一个next指针一便于将pcur释放后重新找到下一个节点释放,...总结 总的来说,在实现双链表的算法时,在插入和删除上优先考虑的是插入一个节点会影响到那些节点、删除一个节点又会影响到那些节点,以及被影响节点的指针的指向。这里最好画图加以理解。

    7410

    数据结构(三):线性表

    在单链表中,每个节点应该包含存储元素的数据域和指向下一个节点的指针域,我们使用 C语言的结构体来定义单链表的节点类型: typedef char ElemType; typedef struct ListNode...采用类似单链表的类型定义,不过和单链表不同的是,双链表有两个指针域。...我们用 LInkList类型的变量来表示一个链表,它包含了一个指向链表开始节点的指针和表示链表长度的变量 length。...,在删除节点时我们也要先定位第 i-1个节点,不过和插入节点有一点不同的是,我们要先检查第 i个节点是否存在,只有当第 i个节点存在时我们才执行删除操作。...这里我们为什么要定位第 i-1个节点,而不是第 i个节点呢? 这是因为单链表只能单向访问,第 i个节点时无法访问第 i-1个节点的。

    81160

    【数据结构】链式家族的成员——循环链表与静态链表

    前面我们重点介绍了通过C语言来实现单链表与双链表的一些基本操作,希望大家私下能够多多练习一下,帮助自己去吸收消化这些内容。...一、循环链表 在前面介绍的单链表和双链表中,我们会发现,不管是单链表的表尾结点还是双链表的头结点和表尾结点,它们在创建好后指向的内容都是空指针,如下图所示: 正因为这种存储结构,导致我们在处理表头元素、...正因为这个点所以在对循环单链表进行判空操作时我们就有了一个改动: 由原先的判断头结点的指针域指向指向的是不是NULL,改为指向的是不是L; 用C语言来表示则是: //循环单链表的判空 bool Empty...,它们的插入、删除是一致的,唯一的区别就是,我们在对表尾结点的处理上会有差异: 单链表的表尾结点的指针域判断指向的是NULL; 循环单链表的表尾结点的指针域判断指向的是L; 用C语言来表式则是: //循环链表的表尾结点判断...用C语言表示则是: //循环双链表的判空操作 bool Empty(DLinkList L) { assert(L);//当L为空指针时报错 if (L->prior == L->next && L

    46110

    【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

    ,这里就不一一列举了,我们主要来解释一下分类里面的每组名词是什么意思 带头和不带头:带头和不带头不是我们之前说的头结点,之前我们的头结点是链表中存储数据的第一个节点,这里的带头是我们在创建链表时会申请一个头结点...,接下来我们就来学习双链表的实现 二、双链表的实现    在上面我们已经说过了,平常所说的双链表就是双向带头循环链表,它的特点我们上面已经介绍过了,接下来我们就来实现它,它的实现和单链表的实现的思路差不多...,如果吃透了单链表,双链表的实现就不难了 1.双链表结构的定义    我们在上面说过,双链表属于双向链表,不仅有一个指向下一个节点的next指针,还有一个指向上一个节点的prev指针,其余和单向链表的定义差不多...   我们之前写的单链表没有初始化,但是双链表是有初始化的,因为我们说过,双链表的是带头的,初始化的目的就是为了给我们的双链表申请一个不保存数据的哨兵位 初始化函数1    初始化函数就是为了帮我们申请一个哨兵位节点...   链表有初始化就有销毁,就是没有初始化也要销毁,因为链表中的所有节点都是动态申请的,如果不释放就会导致内存泄漏,在销毁时有一个细节要注意,就是双链表的尾结点不是指向空的,而是指向哨兵位    如果我们开始就从哨兵位开始释放

    12610

    【数据结构】C语言实现带头双向循环链表

    前言 之前已经介绍过数据结构链表中的单链表,现在我们一起来学习双链表。 那什么又是双链表呢? 在学习双链表之前我们来看看链表的分类。 1....,但是我们实际中最常用还是两种结构: 单链表 和双向带头循环链表。...双向循环链表 2.1 双向循环链表的结构 注意:这里的“带头”跟前面我们说的“头节点”是两个概念,实际前面的在单链表阶段称呼不严谨,但是为了同学们更好的理解就直接称为单链表的头节点。...在初始状态时,双向链表为空,这里的空指的是只有一个哨兵位,而哨兵位节点是不能被操作的,即哨兵位不能被改变。 要用C语言先定义一个包含哨兵位的双向循环链表。...用代码实现双向循环链表 同之前的单链表一样我们用三个文件来实现, List.h用来实现函数声明,List.c用来实现相关函数,test.c用来测试代码。

    17010

    【数据结构初阶第十节】队列(详解+附源码)

    云边有个稻草人-CSDN博客 这节课我们学习队列的概念和结构以及实现,需要提前具备前面顺序表和链表的相关知识,这样这节课就会变得非常简单!...队列底层结构选型 : 队列也可以数组和链表的结构实现,使⽤链表的结构实现更优⼀些,因为如果使⽤数组的结构,出队列在数组头上出数据,效率会⽐较低。...下图解释为什么用链表来实现队列 二、队列的实现 Queue.h #pragma once #include #include #include...在队列销毁的时候,不要忘记最后把队列结构里面的phead和ptail指针置为NULL,size == 0。 我们定义了ptail指针,指向队尾,可以直接找到队尾入数据。...经过前几节顺序表,单链表,双链表,栈的学习,今天学习队列真是游刃有余呦,下一节是栈和队列的算法题,期待一下啦~~ 完——

    9510

    数据结构之双链表(超详解)

    链表分类 链表总共有八种结构如下。 在众多链表结构中,实际中最常用的有这两种结构:单链表和双向带头循环链表(即双链表)。 无头单向非循环链表:结构简单,⼀般不会单独用来存数据。...结构 根据双链表概念,定义结构两个指针分别指向下一个结点和前一个结点的地址,并且每一个结点都能存储数据data。...申请结点 创建头节点 根据概念创建一个头结点起到"放哨"的作用,这个结点可随意给值。 为什么用一级指针接收呢?...需要注意的是:删除指定结点后,由于形参不能改变实参,因此需要我们手动置指定结点为NULL。 查找结点 和单链表一样,我们只需要遍历原链表查找结点,若没找到则返回NULL。...链表打印 双链表销毁 定义pcur指向头结点的下一个结点,并遍历双链表。 每次释放pcur结点,并让pcur指向下一个结点,直到pcur与头结点phead相遇为止。

    8810

    单链表的算法

    要点 在顺序表的算法文章中,我们讨论了线性表的顺序存储结构——顺序表。 顺序表是用一组地址连续的存储单元来保存数据的,所以它具有随机存取的特点。...链表 链表是线性表的链式存储结构,它相比于顺序表,在插入和删除元素时,效率要高很多。 链表,是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。...单链表 链表可分为单链表、双链表、循环链表。 本文先介绍单链表。 单链表就是沿着单方向的链表。例如:A->B->C->D->... 只能顺序的连下去,即可以从A往下找其他元素,但是反之则不行。...; } LNode, *LinkList; 基本算法 插入结点 假设要在单链表的a结点和b结点之间插入一个值为x的新结点。...本人的编译环境为Visual Studio2010,C语言。

    67490

    链表操作详解

    一、单链表和双向链表基本介绍 (1)什么是单链表 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。...(2)什么是双链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。...一般我们都构造双向循环链表————百度百科 双链表的访问就比单链表有优势,当数据量比较大时,想要对末尾的节点进行操作需要有个变量把前面节点全都遍历,但是双向链表只需要头节点的前驱就索引到目标了。...i < pos - 1; i++) p = p->next; node->next = p->next;//进行插入 p->next = node; return head; } (8)销毁单链表...pos->next->pre = prev;//pos的下一个节点的前驱指向前一个节点 return; } (9)双链表销毁: void ListDestory(LTNode* phead) {

    9810

    【初阶数据结构与算法】初阶数据结构总结之顺序表、单链表、双链表、栈、队列、二叉树顺序结构堆、二叉树链式结构(附源码)

    (2)动态调整大小:单链表不需要预先分配固定大小的存储空间,可以根据需要动态地增加或减少节点,从而适应不同规模的数据集合。 (3)节省空间:对于稀疏的数据集合,单链表可以节省空间。...例如,在实现动态数据结构(如动态数组、栈、队列等)时,可以考虑使用单链表。 (2)元素数量不确定的场景:单链表可以根据需要动态地增加或减少节点,从而适应不同规模的数据集合。...(2)双向遍历:双向遍历的特性使得双链表在某些算法和操作中更加高效,如反转链表、合并链表等。...这些操作在算法和数据结构领域中非常常见,因此双链表在这些场景中具有广泛的应用。 (4)内存管理:在数据库系统中,双链表可以用于实现内存池,以提高内存分配和释放的效率。...,有什么不懂的欢迎私信我,后面我们就开始正式学习八大排序算法了,敬请期待吧!

    13410

    数据结构——队列的讲解(超详细)

    正文: 1.队列的概念和结构 1.1.队列的概念 队列和栈一样也是一种线性表,只不过队列和栈是不同的,队列是从一端进入,从另一端出,就有先进先出FIFO的特点,小编之前讲过的栈,是有后进先出的特点,...2.队列的实现 (基于单链表实现) 首先,队列和栈一样,它们都有两种实现方式,栈的时候我们选择了底层是顺序表的方式,因为栈涉及到了尾插,所以顺序表的时间复杂度比较小,但是队列不一样,队列因为是尾插头删...,所以小编在本篇文章中的队列是用链表(单链表)来实现的,当然,队列也可以用顺序包实现,后面小编会在习题的分享上来告诉各位如何创建的,那么下面正式开启我们的代码之旅~下面是队列所对应的结构体,其中我们要设置一个单链表的结点从而方便表示队列的数据...,如果不为空的话,那么我们可以直接让队尾的下一个数据为新节点,让队尾的下一个节点在变成队尾,与当初小编写的单链表尾插差不多,不过小编当初写单链表可是没有创建链表尾,当时是用了循环才找到最后一个结点,所以我们在队列中设置队尾...QueuePush(Queue* pq, QDataType x) { assert(pq); if (pq->phead == NULL && pq->plist == NULL) //很简单错误,c语言是没有连等这一回事的

    43010

    【数据结构】——双链表的实现(赋源码)

    双链表的概念和结构 双链表的全称叫做:带头双向循环链表 它的结构示意图如下 注意:这⾥的“带头”跟前⾯我们说的单链表的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严谨,但是为了读者们更好的理解就直接称为单链表的头结点...; }; 则上面的图可以变成这样 双链表新结点的创建及双链表的初始化 ListNode* LTBuyNode(LTDataType x) { ListNode* newnode = (ListNode...,不过有一个特殊的地方 头插是头插在哨兵位和第一个真正的结点中间 同样的,上面的顺序位置是不能改变的 测试头插代码 这个代码是在上面尾插代码基础上的操作  双链表的尾删 //尾删 void LTPopBack...3,所以我们可以找到  这个在链表中没有数据6,所以我们没有找到相关的数据   在pos之后插入结点 这个和尾插以及头插其实是类似的,这里主要是寻找到pos结点,然后插入想要的数据 //在pos之后插入结点...pos->next pos->prev->next = pos->next; pos->next->prev = pos->prev; free(pos); pos = NULL; } ​ 双链表的销毁

    8410

    数据结构从入门到精通——链表

    链表有多种类型,如单向链表、双向链表和循环链表等。单向链表是最简单的链表类型,每个节点只有一个指向下一个节点的指针。...x); // 单链表在pos位置之后插入x // 分析思考为什么不在pos位置之前插入?...这些操作同样需要对链表结构有深入的理解,并且能够正确处理各种边界情况。在实际应用中,链表的操作通常与其他数据结构或算法相结合,以实现更复杂的功能。...在遍历过程中,我们需要逐个访问链表中的每个节点,并释放其内存。这通常通过调用适当的内存释放函数来完成,例如在C++中使用delete操作符,或在C语言中使用free函数。...通过正确地释放每个节点的内存,并断开它们之间的连接,我们可以确保链表被完全销毁,从而避免潜在的内存泄漏和其他问题。这种负责任的资源管理实践是编写高效、可靠的代码的重要组成部分。

    48311

    【初阶数据结构与算法】线性表之栈和队列的定义与实现(含源码和有效的括号练习)

    ⽐较小    删除数据也比较简单,而链表除非使用双链表,否则使用单链表操作尾部数据,必须遍历整个链表,付出的代价更大,所以我们一般选择使用数组做我们栈的底层    为什么不使用双链表呢?...我们之前也讲过单链表和双链表的区别,单链表结构更简单,适合做其它数据结构的底层,双链表结构复杂,更适合直接存放数据,所以我们在考虑数据结构的底层时,一般考虑的是单链表还有数组,在实现栈的时候我们就使用数组作为底层的结构...栈的初始化和销毁 栈的初始化    栈的初始化和顺序表类似,就是将栈中的数组置为空,将数组总容量和有效数据个数置为0,由于我们需要修改栈,所以我们要传地址,如下: //初始化栈 void STInit(...**题目没有提供栈,我们需要复制我们写的栈过去,以后学了C++就可以直接使用栈了,不用自己写,现在我们暂时先使用我们写的栈,还有就是我们在返回结果前,要把栈销毁掉,以免造成内存泄漏    那么括号匹配成功的情况和失败的情况我们都分析完了...,希望大家有所收获,如果有什么问题欢迎私信我,文章有什么不足也欢迎纠错    bye~

    10310

    【初阶数据结构】双向链表 - 路途的美好风光(内含双链表的定义和代码实现)

    前言 我已经在初阶数据结构这个栏目中已经给大家讲过了两种数据结构,分别是顺序表和单链表。那么在本文中,我继续的给大家讲解下一个数据结构——双向链表。...这里我们需要避免一个误区: 我们平常在写代码时,通常会说给空的单链表创建一个头节点,其实这个说法是不对的,这么说只是为了方便大家想象和编写代码。 而头节点真正表示的是一个链表的首部,“头”。...这个节点比较的特殊,它不存储有效的数值。我亲切的称呼它为“哨兵位”。那它有什么作用呢?在单链表的代码实现中,我们会常常苦于链表尾空链表的情况,为此还要专门给出一个判断条件。... //定义双向链表的节点 //在定义之前,我们说一下什么是双向链表?...//所谓的双向链表,其全称为有头双向循环链表。

    7910
    领券