一、循环双链表的概念
循环双链表的定义
二、循环双链表的基本操作
双链表的初始化
头插
尾插
头删
尾删
查找
双链表的销毁
三、循环双链表的代码呈现
函数定义
函数调用
函数实现
四、总结
一、循环双链表的概念
1.循环双链表的定义
双链表由一个个的节点组成,节点有三个组成部分:指向前面的pre指针、值和指向后面的next指针.双链表需要创建一个影子节点,这个节点不存储任何的有效元素。
二、循环双链表的基本操作
1.循环双链表的初始化
由于实现循环链表需要创建一个影子节点他的pre和next指针都指向自己

2.尾插
先检查节点是否存在,存在往下走;调用创建节点函数,该函数malloc空间返回该节点;如果链表中没有节点影子节点的pre指针和next指针都指向新节点,而新节点的next和pre也指向该影子节点。如果链表中存在节点,则通过影子节点的pre指针找到尾节点,先将其尾节点的next指针指向新节点,而新节点的pre执政指向该尾节点,新节点的next指针指向影子节点,影子节点的pre指向新节点。尾插完成。和单链表完全不一样,循环双链表的尾插时间复杂度只需要O(1),而单链表则需要O(N)。

3.头插
判断指针本身是否存在,调用创建函数,判断该链表的next指针是否指向自己,如果指向自己,则将其next和pre两个指针指向newnode,newnode的next和pre则指向该节点;如果该链表中没有指向自己,则证明该链表不是空链表,先将影子节点的下一个节点的pre指针指向新节点,新节点的next指针指向他,然后在将新节点的pre指针指向影子节点,影子节点的next指针指向新节点。头插完成。

4.头删
判断其是否满足头删条件:指针本身是否为空和链表内元素是否只存在影子节点,满足则直接跳出。不满足往下执行,先将影子节点后的节点单独放在一个变量中,取找该节点的下一个节点的prev指针指向影子节点,影子节点指向node的下一个节点。头删完成。

5.尾删
判断其是否满足尾删条件:指针本身是否为空和链表内元素是否只存在影子节点,满足则直接跳出。不满足往下执行。去找影子节点的前一个结点用node定义,然后取找node前一个结点的next指针,指向影子结点,影子结点的pre指针指向node的前一个结点。

6.查找
先判断该链表中是否能够查询有两个条件,指针是否为NULL,结点的next是否指向自己。定义一个变量去遍历该链表。如果找到了与x相同的值直接返回该结点,遍历结束还没找到,则返回NULL。

7.销毁
利用一个pcur值放入影子结点的后一个结点,跑到影子结点出遍历结束,在遍历中,把pcur的下一个结点放入next内,释放pcur,将next的值放入pcur内,释放完成后,将原来的指针释放,最后置为NULL。

三、循环双链表的代码呈现
1.函数定义

2.函数调用


3.函数实现




四、总结
这是笔者有关于双循环链表的基本操作与代码实现,希望对读者学习循环链表有个初步的认识。
735

被折叠的 条评论
为什么被折叠?



