介绍
单向循环链表 = 普通单向链表 + 闭环改造。
单向链表,最后一个结点的指针 是指向 NULL,如下图:

单向循环链表,是把 最后一个结点的指针,改成指向 头结点,形成一个闭环,如下图:

特点
无 NULL 结尾,尾结点指向头结点,从任意一个结点出发,都能遍历整个链表
类比
- 普通单向链表像一条“直线跑道”,跑到头就停了
- 单向循环链表像 学校操场,是 环形的,跑一圈能回到起点,随便从哪个位置开始跑,都能跑完整个跑道。
分类
- 仅设尾指针的单向循环链表(无头结点)
- 有头结点的单向循环链表
仅设尾指针的单向循环链表
有 尾指针、没有头结点 的单向循环链表
尾指针,指向 尾结点 的指针

优点
- 仅需一个尾指针,即可定位头、尾节点(无需头结点)
- 所有节点都是存储数据的有效节点;
- 首结点:尾结点的指针指向的结点
头部插入节点时间复杂度
O (1)),尾结点指向新节点
头部删除节点的时间复杂度
O (1),尾节点的指针,跳过原节点,指向下一个节点
尾部插入节点时间复杂度
O(1),尾指针直接指向尾节点,仅需修改指针
删除尾部节点时间复杂度
O(n),单向链表无法反向找前驱,需遍历找尾节点的前一个节点
有头结点的单向循环链表

- 头结点的数据是空,指针指向首节点
- 最后一个有效节点的指针指向头结点(形成循环);
优点
空链表时,头结点的指针指向自己,无需单独判断指针是否指向null
单向循环链表 vs 普通单向链表
区别:
| 对比项 | 普通单向链表 | 单向循环链表 |
|---|---|---|
| 结尾标志 | 尾结点指针指向 NULL |
尾结点指针指向 头结点 |
| 遍历结束条件 | 遇到 NULL |
指针指向头结点 |
| 空表判断 | 头结点指针指向NULL |
头结点指针指向头结点 |
| 遍历起点 | 只能从头结点开始 | 任意结点均可遍历全表 |
| 尾结点查找 | 需遍历到 NULL 前一个结点 |
找到某节点,该节点的指针指向头结点 |
操作
初始化(创建空表)
创建头结点,让头结点的指针指向自己,形成空表。
遍历链表
核心区别:普通单链表遍历到 NULL 结束,单向循环链表遍历到「回到头结点」结束。
易错点提醒:遍历起点不能是 head(头结点不存数据),必须是 head->next;忘记判断 p == head 会导致死循环(软考选择题常考错误选项)。
尾插法建立单向循环链表
核心:每次插入新结点,都让新结点的 next 指向头结点,同时更新原尾结点的 next 指针,保持闭环。
优缺点
优点(核心3点)
灵活性高:从任意结点均可遍历整个链表,无需从头开始;
逻辑统一:无
NULL结尾,空表、非空表、尾结点的判断逻辑一致,不易出错;适配环形场景:特别适合循环、轮询类需求(如操作系统时间片轮转、循环队列、任务轮询),软考常考应用场景选择题。
缺点
只能单向遍历:无法快速访问前驱结点,只能从当前结点向后遍历;
易死循环:若遍历、插入、删除时,忘记判断“是否回到头结点”,容易导致死循环。
总结
最后整理了最核心的考点,浓缩成5句话,考前快速过一遍,避免踩坑:
单向循环链表的核心:尾结点
next指向头结点,形成闭环,无NULL结尾;空表判断(必考):
head->next == head;遍历结束条件(必考):
p == head;尾结点判断(必考):
p->next == head;核心应用场景:循环队列、任务轮询、时间片轮转(选择题常考)。
八、备考小提醒
单向循环链表的考点不难,但细节多,易错点主要集中在「判断条件」(空表、遍历结束、尾结点),大家备考时,重点记“三个判断条件”,结合图示理解,不要死记硬背。
另外,注意区分「单向循环链表」和「双向链表」「循环双向链表」的区别,后续会继续更新相关考点,记得关注哦~
如果觉得这篇讲解对你有帮助,欢迎点赞、收藏,备考路上一起加油,争取一次拿下软件设计师证书!💪
结尾彩蛋:评论区回复“单向循环链表”,可领取软考真题中该考点的相关题目(带解析),帮大家快速检验学习效果~
这篇博客已经涵盖备考核心内容,适配软件设计师考生需求。需要我帮你补充软考真题示例(带解析) ,让博客更具实用性吗?