[数据结构]循环链表
循环链表(Circular LinkList)
循环链表有以下两种:
- 循环单链表: 从一个结点出发只能找到后续的各个结点.
- 循环双链表: 从一个结点出发可以找到其他任何一个结点.
0x01 循环单链表
单链表和循环单链表的区别:
- 单链表: 表尾结点的next指针指向NULL
- 循环单链表: 表尾结点的next指针指向头结点
循环单链表的定义和单链表一样, 如下所示:
1 | struct LNode{ //定义单链表结点类型 |
或者,
1 | typedef struct LNode{ //定义单链表结点类型 |
两者等价。
0x0101 循环单链表的初始化
1 | /*** |
初始化: 头结点的next指针指向自己.
0x0102 循环单链表的判空
所以判断一个循环单链表是否为空值时只需要判断是否 L->next == L
即可(头结点的next指针指向自己).
1 | /*** |
0x0103 循环单链表的判尾
同理, 判断一个结点是否为循环单链表的表尾结点只需要判断:
- 该结点的next指针是否指向头结点
1 | /*** |
循环单链表的插入和删除操作和单链表类似, 由于篇幅不宜过长, 就不展开叙述了.
0x02 循环双链表
双链表和循环双链表的区别:
- 双链表:
- 表头结点的prior指向NULL
- 表尾结点的next指向NULL
- 循环双链表:
- 表头结点的prior指向表尾结点
- 表尾结点的next指向表头结点
循环双链表的定义和双链表一样, 如下所示:
1 | typedef struct DNode { //定义双链表结点类型 |
或者:
1 | struct DNode { //定义双链表结点类型 |
两者等价.
0x0201 循环双链表的初始化
初始化一个循环双链表: 头结点的prior指针
指向头结点, 且头结点的next指针
也指向头结点.
1 | /** |
0x0202 循环双链表的判空
判断一个循环双链表是否为空:
1 | /** |
0x0203 循环双链表的判尾
判断一个结点是否为循环双链表的表尾结点:
1 | /** |
谢谢观看 😘
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 q1jun's Blog!
评论