c语言判断链表是否为循环链表

        普通链表与循环链表的区别在于:普通链表的最后一个节点指向为NULL,而循环链表最后一个节点指向该链表中的任意一个节点,如同一个环。循环链表问题引出了一个在链表中很重要的概念:快、慢指针。快、慢指针可以帮助我们解决很多经典链表问题,详细如下。

        普通链表与循环链表的示意图如下:

         判断链表是否循环思路:定义两个指向头节点的指针,分别为fast和slow,从名字就可以看出一个指针为快指针,另一个为慢指针。定义快指针一次走两个节点的距离,而慢指针一次走一个节点的距离,入下图所示:

        若fast指针走到NULL时说明链表不是一个循环链表,当fast与slow相等时,即他们指向同一个节点说明该链表是一个循环链表。 因为在循环链表中,fast是slow的两倍速度,则fast迟早会从环中追到slow,这时候他们是指向同一个节点。

        代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>typedef struct ListNode //创建节点结构体
{int data;struct ListNode* next;
}LNode;bool hasCycle(LNode* head)//bool值表示符合条件返回真,不符合条件返回假
{LNode* slow = head, * fast = head;//定义快慢指针while (fast && fast->next)//当fast或者fast的next为空时跳出循环{slow = slow->next;//slow走一步fast = fast->next->next;//fast走两步if (fast == slow)return true;//是循环链表返回真}return false;//当fast或者fast的next为空时说明不是循环链表,因此返回假
}void Print(LNode* phead)//打印函数
{LNode* cur = phead;while (cur){printf("%d->", cur->data);cur = cur->next;}printf("NULL");//模拟链表最后指向的是NULL
}int main()
{LNode* n1 = (LNode*)malloc(sizeof(LNode));//创建5个节点,为了测试函数LNode* n2 = (LNode*)malloc(sizeof(LNode));LNode* n3 = (LNode*)malloc(sizeof(LNode));LNode* n4 = (LNode*)malloc(sizeof(LNode));LNode* n5 = (LNode*)malloc(sizeof(LNode));LNode* plist = n1;//指向头节点的头指针plistn1->data = 1;//给每个节点都赋值n2->data = 2;n3->data = 3;n4->data = 4;n5->data = 5;//设置循环链表n1->next = n2;//手动构建链表n2->next = n3;n3->next = n4;n4->next = n5;n5->next = n3;//这里将n5指向n3,目的是设置循环链表if (hasCycle(plist) == false)printf("不是循环链表\n");elseprintf("是循环链表\n");return 0;
}

         运行结果:

         代码中我们将n5->next = n3;因此该链表为循环链表,运行结果符合逻辑。

结语:

        以上就是判断链表是否循环的解法,用到的快、慢指针概念是链表中非常经典的一种解题手法,希望本文可以对你起到帮助。( ̄︶ ̄)↗ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/180533.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务专题】Spring启动过程源码解析

目录 前言阅读对象阅读导航前置知识笔记正文一、SpringBoot启动过程源码解析1.1 SpringBoot启动过程源码流程图1.2 流程解析补充1.2.1 SpringApplicationRunListeners&#xff1a;SpringBoot运行过程监听器 学习总结感谢 前言 这部分只是个人的自结&#xff0c;方便后面回来看…

【原创】java+swing+mysql个人日记管理系统设计与实现

摘要&#xff1a; 个人日记管理系统是一个可以记录、管理、存储和检索个人日记的应用程序。这个系统允许用户创建和管理多个日记帐户&#xff0c;每个帐户都可以有多个日记条目。用户可以随时添加、编辑或删除日记条目&#xff0c;并可以将这些条目按照主题或其他标准进行分类…

推介会如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式&#xff0c;旨在促进交流活动&#xff0c;形成合作&#xff0c;从而带来共同利益。推介会的本…

Mendix 创客访谈录|低代码赋能IoT应用开发

本期创客 郑锴 舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部 毕业于浙江大学&#xff0c;三年软件设计开发经验。目前任职于舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部&#xff0c;担任软件开发工程师&#xff0c;主要负责工业互联网相关软件…

Java医院绩效考核管理系统源码,设有手工录入功能(可以批量导入)

医院绩效考核系统以医院的发展战略为导向&#xff0c;把科室、员工的绩效考核跟战略发展目标紧密结合&#xff0c;引导医院各个科室、各员工的工作目标跟医院的发展目标结合在一起&#xff0c;实现医院的优化发展。系统提供灵活的绩效考评体系配置方案&#xff0c;支持不同科室…

开源博客项目Blog .NET Core源码学习(6:雪花算法)

Blog .NET项目中有多种数据类生成对象实例时需要唯一标识&#xff0c;一般做法要么使用GUID&#xff0c;也可以保存到数据库时使用数据库表的自增长ID&#xff0c;也可以自定义规则以确保产生不重复的唯一标识&#xff0c;而在Blog .NET项目中使用雪花算法生成唯一标识。   关…

Golang实现一个一维结构体,根据某个字段排序

package mainimport ("fmt""sort" )type Person struct {Name stringAge int }func main() {// 创建一个一维结构体切片people : []Person{{"Alice", 25},{"Bob", 30},{"Charlie", 20},{"David", 35},{"Eve…

深兰科技轮腿家用AI机器人荣获“2023年度城市更新科创大奖”

近日&#xff0c;“2023金砖论坛第五季金立方城市更新科创大会”在上海举行&#xff0c;会上发布了《第12届金砖价值榜》&#xff0c;深兰科技研发出品的轮腿式家用AI机器人(兰宝)&#xff0c;因其AI技术的创新性应用&#xff0c;荣获了“2023年度城市更新科创大奖”。 在10月2…

Go语言fyne开发桌面应用程序-环境安装

环境安装 参考https://developer.fyne.io/started/#prerequisites网站 之前的文章介绍了如何安装GO语言这里不在叙述 msys2 首先安装msys2&#xff0c;https://www.msys2.org/ 开始菜单打开MSYS2 执行 $ pacman -Syu$ pacman -S git mingw-w64-x86_64-toolchain注意&#…

香港科技大学广州|机器人与自主系统学域博士招生宣讲会—电子科技大学专场!!!(暨全额奖学金政策)

在机器人和自主系统领域实现全球卓越—机器人与自主系统学域 硬核科研实验室&#xff0c;浓厚创新产学研氛围&#xff01; 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; &#x1f559;时间&#xff1a;…

Winodws核心编程 多线程

目录 一、基本概念 二、线程创建函数 三、Windows内核对象与句柄 四、简单的多线程案例 五、线程同步 - 互斥对象 六、多线程实现群聊的服务端和客户端 七、线程同步 - 事件对象 八、事件对象 与 互斥对象区别 九、线程同步 - 信号量 十、线程同步 - 关键代码段 十一…

uniapp app tabbar 页面默认隐藏

1.在page.json 中找到tabbar visible 默认为true,设为false则是不显示 uni.setTabBarItem({ index: 1, //列表索引 visible:true //显示或隐藏 })