链表(linked list)是一种线性表,但是并不会在物理存储上按照线性顺序存储数据,而是在每一个节点里存到下一个节点的指针。由于不必须按照顺序存储,所以说链表的插入和删除操作可以达到O(1)的复杂度。这一篇文章我们将讲一下单向链表和双向链表,并且其中双向链表会给出关键的代码来加以解释。
1:单向链表
单链表是链表的一种,它是由节点组成,每个节点都包含着下一个节点的指针,下图就是一个单链表,表头为空,表头的后继结点是“节点10”(数据为10的节点),”节点10”的后继结点是“节点20”(数据为20 )。。。。。。
2:单链表删除节点
我们现在来看一下单链表删除节点的操作,比如说下面这个单链表中我们要删除节点“30”
删除之前:“节点20”的后继结点为“节点30”,而"节点30" 的后继节点为"节点40"。
删除之后:"节点20" 的后继节点为"节点40"。
3:单链表添加节点
我们再来看看单链表添加节点的操作,比如说下面这个单链表中我们在"节点10"与"节点20"之间添加"节点15"
添加之前:"节点10" 的后继节点为"节点20"。
添加之后:"节点10" 的后继节点为"节点15",而"节点15" 的后继节点为"节点20"。
4:双向链表
双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
双链表的示意图如下:
表头为空,表头的后继节点为"节点10"(数据为10的节点);"节点10"的后继节点是"节点20"(数据为10的节点),"节点20"的前继节点是"节点10";"节点20"的后继节点是"节点30","节点30"的前继节点是"节点20";...;末尾节点的后继节点是表头。
不难看出,双向链表的节点定义可以用一个下面的结构体表示:
5:双向链表删除节点
我们看看双向链表删除节点的操作,比如说下面这个单链表中我们要删除"节点30"。
删除之前:"节点20"的后继节点为"节点30","节点30" 的前继节点为"节点20"。"节点30"的后继节点为"节点40","节点40" 的前继节点为"节点30"。
删除之后:"节点20"的后继节点为"节点40","节点40" 的前继节点为"节点20"。
双向链表删除节点的关键代码如下:
6:双向链表添加节点
我们再来看看双向链表添加节点的操作,比如说下面这个双向链表在"节点10"与"节点20"之间添加"节点15"
添加之前:"节点10"的后继节点为"节点20","节点20" 的前继节点为"节点10"。
添加之后:"节点10"的后继节点为"节点15","节点15" 的前继节点为"节点10"。"节点15"的后继节点为"节点20","节点20" 的前继节点为"节点15"。
以后这一系列的文章我将会持续的转载更新,这篇文章是来自上善若水,也欢迎大家关注他的公众号:码农有道,让我们一起进步吧