| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 初阶数据结构——线性表——链表——带头双向循环链表 -> 正文阅读 |
|
[数据结构与算法]初阶数据结构——线性表——链表——带头双向循环链表 |
前言 其中在链表的实现中有很多种实现方法,主要取决于以下几个因素
这几个特征两两组合,就可以看做一种链表的实现方式 但在实际中运用最大的,其中就只有以下两种: 不带头单向不循环和我们本文的实现方式——双向带头循环 其中前者在oj题中考的特别多,而且可以作为其它数据结构,比如哈希桶的子结构,所以应用比较广泛 但是,前者却不适合用来存储数据 因为我们在尾插,尾删等函数接口中,需要遍历查找链表尾 而且,还需要考虑头结点为空等等问题 所以,我们引入了带头双向循环链表,带头结点可以有效解决插入时链表为空的问题,而循环可以解决寻找尾结点的问题,双向让我们方便寻找当前结点的前面一个结点 在本文中实现的结构虽然看起来复杂,但是实现却非常简单,在实际应用中也最适合于存储数据 其中循环的体现:尾结点不指向NULL,而指向头结点 双向的体现:结点间两两相互链接,后面结点可以找到前面的结点 逻辑结构图如下
双向链表定义与单链表差不多用结构体定义,不过需要多一个prev指针存储前面结点的地址 定义
同样,为了方便存储类型的替换,将我们的数据类型统一命名
初始化因为我们的链表是带头的,所以我们在初始化的时候需要开辟一个头结点出来 我们为了满足循环的特征,将头结点的next和prev都指向自己
初始化函数使用:
双向链表的插入在本文插入中,传参不再用到二级指针,因为头指针的指向永远不会改变 并且,无需考虑边界情况 插入函数前文中已经介绍,这里不再详细阐述
尾插有了尾结点,我们的尾插就变的相对简单的多 根据循环的特征,我们头结点的前面一个结点就是尾结点
对边界情况的讨论: 空链表 所以,在后续的插入中,我们并不需要特殊讨论 头插头插在头结点后面插入就行了,这里不再详细阐述 要注意它们之间的相互链接关系: newnode和phead和原来的phead->next都需要做到两两相互链接 这里的phead->next如果看的不顺眼,也可以用变量代替
任意位置插入同样,我们需要查找函数来查找我们需要插入的位置,参数传递也只需要传入这个位置的指针 因为我们现在方便查找前面的结点,所以我们可以实现在pos位置之前的插入 为了方便,用posPrev记录pos位置之前的结点 注意链接关系就行,没什么难度 边界情况为空链表,头插,尾插,大家可以尝试走读代码,可以发现边界情况在这种结构中通通不用考虑
双向链表的删除尾删我们同样方便找到尾部的结点 需要变量来记录,重新建立链接关系时,绕开尾结点即可 最后把尾结点释放掉 但是,这里的边界情况需要讨论 当链表为空时,我们再调用这个函数的话,连头结点也会被释放掉 所以为了避免这个问题,我们可以加一个断言,判断phead->next是不是它本身即可
头删同样绕开头结点即可,没什么难度
任意位置的删除任意位置删除只需要修改两个结点就可以绕开我们当前需要释放的结点
查找函数使用方法已经在前文介绍过了,这里不再做过多的阐述 但是这里我们的查找是从头结点的下一个结点开始的,结束条件是看是不是遍历回到了头结点,因为这是循环链表,如果条件设置不恰当,很容易造成死循环
但我们可以发现,在链表中最优的结构中,查找的时间复杂度仍然是O(N),所以查找复杂度高是链表中最大的缺点 打印函数同样是遍历打印
链表销毁为了防止内存泄露,在我们使用完链表后,最好将它们全部销毁 在这里我们最后才释放phead,因为phead是我们的判断条件 为了防止当前位置释放后找不到下一个结点,我们在这里用两个指针来遍历
一个使用示例
运行截图: |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:46:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |