软考-软件设计师:数据结构-线性结构-线性表-单向循环链表

介绍

单向循环链表 = 普通单向链表 + 闭环改造。

单向链表,最后一个结点的指针 是指向 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点)

  1. 灵活性高:从任意结点均可遍历整个链表,无需从头开始;

  2. 逻辑统一:无 NULL 结尾,空表、非空表、尾结点的判断逻辑一致,不易出错;

  3. 适配环形场景:特别适合循环、轮询类需求(如操作系统时间片轮转、循环队列、任务轮询),软考常考应用场景选择题。

缺点

  1. 只能单向遍历:无法快速访问前驱结点,只能从当前结点向后遍历;

  2. 易死循环:若遍历、插入、删除时,忘记判断“是否回到头结点”,容易导致死循环。

总结

最后整理了最核心的考点,浓缩成5句话,考前快速过一遍,避免踩坑:

  1. 单向循环链表的核心:尾结点 next 指向头结点,形成闭环,无 NULL 结尾;

  2. 空表判断(必考):head->next == head;

  3. 遍历结束条件(必考):p == head;

  4. 尾结点判断(必考):p->next == head;

  5. 核心应用场景:循环队列、任务轮询、时间片轮转(选择题常考)。

八、备考小提醒

单向循环链表的考点不难,但细节多,易错点主要集中在「判断条件」(空表、遍历结束、尾结点),大家备考时,重点记“三个判断条件”,结合图示理解,不要死记硬背。

另外,注意区分「单向循环链表」和「双向链表」「循环双向链表」的区别,后续会继续更新相关考点,记得关注哦~

如果觉得这篇讲解对你有帮助,欢迎点赞、收藏,备考路上一起加油,争取一次拿下软件设计师证书!💪

结尾彩蛋:评论区回复“单向循环链表”,可领取软考真题中该考点的相关题目(带解析),帮大家快速检验学习效果~

这篇博客已经涵盖备考核心内容,适配软件设计师考生需求。需要我帮你补充软考真题示例(带解析) ,让博客更具实用性吗?


原文出处:/show_1GW2kQ1FIaUU.html