开发者学堂课程【Go 语言核心编程 - 数据结构和算法: 数据结构和算法-双向链表介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9839
数据结构和算法-双向链表介绍
单向链表与双向链表
(1)双向链表的基本介绍与示意图
首先要知道什么叫双向链表,双向链表就是在原先基础上可以做成这种东西,会形成这么一个情况,就是头结点还是头结点,它的前一个节点可以指向后一个节点,同样后一个节点也可以指向前一个节点,就把它叫做双向链表,它是非环形的双向链表,
如下图所示:
(2)关于方向问题
单向链表查找的方向只能是一个方向,就是它只能从头往后面,一条线的走,不能乱跑,它不能反向从尾往头走,没有这个东西,所以它只能是一个方向;而双向链表可以向前或者向后查找,效率有时能更高一点。
(3)关于自我删除问题
单向链表不能自我删除,需要靠辅助节点,打个比方,假如这里有一个链表,这个链表现在有这么几个节点,如图所示,现在有一个 temp节点在不停的找,突然 temp 找到了一个节点,是二号,它说我要把这个节点删掉,它其实没有机会删掉的,假设 temp 的指针指向了二号节点,想把二号节点从这个链表里面拿掉,根本拿不掉,因为没办法去访问到它前一个结点的 next 的字段,
具体参考下图:
还有种列表更恐怖,它是形成一个环形的双向链表,那这个难不难呢?其实一点都不难,这个必须掌握,因为有些面试官,他喜欢问双向链表会不会用。
如果一旦上图中的形式存在了,就有个好处,即可以实现自我删除,比如现在 temp 指向了二号节点,如果想把自己删除,是非常的轻松,只需要通过这个节点访问到其前一个节点的下一个节点,让它指向它的下一个节点,然后再通过其下一个节点,找到卢俊义的下一个节点,然后再让它又指向我指向的前一个节点,这样一条线形成过后,可以看到宋江直接指向卢俊义,卢俊义直接指向宋江,那么中间的2在哪里呢?
可以看到它只有两条线,它下一个节点指向卢俊义,前一个节点指向宋江,但是没有人指向它了,于是它会成为垃圾被销毁,具体参考下图: