| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【数据结构】必会的两种链表结构之---双向带头循环链表(附源码) -> 正文阅读 |
|
[数据结构与算法]【数据结构】必会的两种链表结构之---双向带头循环链表(附源码) |
目录 前言前面我们讲过,链表分为带头和不带头,双向和单向,循环和非循环链表。 那么经过排列组合之后,就会有8中链表结构。 其中最常用的是单向不带头非循环链表和双向带头循环链表。 前者在之前已经实现过了,今天的内容主要是双向带头循环链表的实现。 双向带头循环链表结构1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。 2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。 实现函数声明注意:
打印链表这里与单链表的区别在于,如何判断打印结束。 使用cur指针遍历链表,初始化 cur = phead->next 循环链表中尾结点不会指向NULL,而是会指向头结点。 那么当 cur = phead 时循环结束,打印完成。
初始化链表初始化时需先创建头结点,但这样会改变头结点,为了使原结构体指针改变,这里可以传二级指针或者返回头结点。但后面的参数我们都会传一级指针,为了使代码具有一致性,这里我们选择用返回值的方法改变原指针。
销毁链表同单链表一样,使用循环依次释放。 但不要忘记释放头结点!
申请结点
尾插尾插相对于单链表来说更加简单,因为这里不需找尾结点。 phead->prev就是尾结点,而且只有头结点时也能解决。 时间复杂度为O(1)。
头插保存第一个有效结点的地址,将新结点插入。 与单链表不同的是,这里不需要移动头结点。
尾删找到尾结点的前一个位置的地址,将他的next指向结点,而头结点的prev指向他。 再释放掉原尾结点。 注意:删除结点时需保证链表中存在有效结点。
头删与尾删类似,保存第一个有效节点的下一个结点的地址, 将头结点的next指向他,他的prev指向头结点, 最后释放掉原第一个有效结点。
查找
在pos位置前面插入与单链表不同,单链表在pos前面插入时,会比较复杂,需要找到pos位置前面的地址。 而双向链表中,在pos前面和后面插入均可。时间复杂度都是O(1)。 而且这个函数相当于可以实现任何位置的插入,当然前面的尾插,头插都可复用此函数。
删除pos位置的结点同样此函数也可以删除任意位置的结点(头结点除外), 前面的头删,尾删也可以复用此函数。
? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 9:54:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |