《大话数据结构》笔记(3-4)--线性表的链式存储结构:循环链表、双向链表
双向循环链表的Java实现代码:
第三章 线性表
循环链表(circular linked list)
基本概念
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。
循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p->next是否为空,现在则是判断p->next是否等于头结点。
带有头结点的空循环链表:
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095321162-324866805.png)
非空的循环链表:
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095322725-880942392.png)
尾指针对两个循环链表的合并操作也非常方便
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095324397-1137759004.png)
双向链表(double linked list)
双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
线性表的双向链表存储结构如下:
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095328006-1775524139.png)
双向链表的循环、带头结点的空链表如下:
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095328287-1925139451.png)
非空、循环、带头结点的双向链表如下:
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095328647-1458407055.png)
双向链表的插入操作
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095329459-1796778595.png)
双向链表的删除操作
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095330647-631818611.png)
![](https://images2015.cnblogs.com/blog/1007623/201704/1007623-20170428095332256-1886641647.png)
双向链表说白了就是空间换时间。