}
循环单链表的遍历与普通的单链表和双向链表的遍历不同,循环链表需要进行结点的特殊判断 。
先找到尾节点的位置,由于尾节点的next指针是指向头结点的,所以不能使用链表本身是否为空的方法进行简单的循环判断,我们需要通过判断结点的next指针是否等于头结点的方式进行是否完成循环的判断 。
此外还有一种计数的方法,即建立一个计数器count=0,每一次next指针指向下一个结点时计数器+1,当count数字与链表的节点数相同的时候即完成循环;
但是这样做会有一个问题,就是获取到链表的节点数同时,也需要完成一次遍历才可以达成目标 。
其代码如下:
//遍历元素
int display(list *head) {
if(head != ) {
list *p = head;
//遍历头节点到,最后一个数据
while(p->next != head ) {
printf("%d ",p->next->data);
p = p->next;
}
printf("n"); //换行
//把最后一个节点赋新的节点过去
return 1;
} else {
printf("头结点为空!n");
return 0;
}
}
进阶概念——双向循环链表循环单链表也有一个孪生兄弟——双向循环链表,其设计思路与单链表和双向链表的设计思路一样,就是在原有的双向链表的基础上,将尾部结点和头部结点进行互相连接 。交给大家了 。
关于链表的总结在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低 。并且需要预先分配足够大的存储空间,而链表恰恰是其中运用的精华 。
基于存储,运算,环境这几方面考虑,可以让我们更好的在项目中使用链表 。
今天链表基础就讲到这里,下一期,我们再见!
【一口气搞懂「链表」,就靠这20+张图了】
推荐阅读
- 「OOM」Java heap space原因与解决
- 「网络特效」12 个炫酷背景特效库
- 日本和果子「水信玄饼」的做法
- Github上复旦小姐姐原创「数据结构和算法系列」
- 一篇文章搞懂热修复类加载方案原理
- 2 「系统架构」如何使用Dockerfile制作Docker容器?
- 苦瓜茶的好处,苦瓜茶的副作用
- 「PHP编程」安装开发环境太烦?告诉你几个简单方法,分分钟搞定
- 百度搜索上线「工具特型卡」公开招募工具类智能小程序
- HTML5 绘图技术 「Canvas」和「SVG」
