双链表
双链表的意义
单链表相对于顺序表,确实在某些场景下解决了一些重要的问题,例如在需要插入或者删除大量元素的时候,它并不需要像顺序表一样移动很多元素,只需要修改指针的指向就可以了,其时间复杂度为 O(1) 但是这可是有前提的,那就是这一切都基于确定节点后,纯粹考虑删除和插入的情况下,但是如果我们仍未确定节点的位置,那么单链表就会出现一些问题了,例如我们来看一下删除这个操作
删除操作
单链表:
对应图中的节点,想要删除第2个节点 a1 只需要 将首元结点的指针指向到第三个节点的地址去
但是问题就在于我们如何得到待删除节点的前驱,也就是我们图中的首元结点,我们给出两种方法
- A:定位待删除节点的同时,一直顺便保存当前节点的前驱
- B:删除节点后,重新回到单链表表头,定位到其指定前驱
但是无论我们选择哪一种方法,指针的总移动数都会是 2n 次,而双链表却在这一类型问题上做出了很好的处理
双链表:
单链表中之所以出现问题,就是因为各个节点只有一个指向后继的指针域 next,只能向后移动查找,一旦我们想要查询前一节点,就变得很麻烦,所以双链表就在每个节点前面增加一个指向前驱的指针域 prior,这样我们就可以直接定位到我们的前一个节点了,这也就是双链表
注意:为了统一运算,避免特殊情况的出现,我们也常常在尾部设置一个 “尾部头结点” 其 next 指针域为空
线性表的抽象数据类型定义
我们在给出双链表的定义之前我们还是需要先引入我们线性表的抽象数据类型定义
#ifndef _LIST_H_
双链表类型的定义
#ifndef _SEQLIST_H_
双链表基本运算的实现
(一) 构造与析构函数
template
(二) 查找位序为i的节点的地址
template
(三) 查找值为value的节点的位序
template
(四) 插入元素
template
(五) 删除位序为i的节点
template
(六) 访问位序为 i的节点的值
template
(七) 遍历双链表
template
(八) 遍历双链表
template
结尾:
如果文章中有什么不足,或者错误的地方,欢迎大家留言分享想法,感谢朋友们的支持!
如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
在这里的我们素不相识,却都在为了自己的梦而努力 ❤
一个坚持推送原创开发技术文章的公众号:理想二旬不止