检测链表中是否存在环

题目、解析和代码

题目:给定一个单链表,判断其中是否有环的存在
解析:这里使用两个遍历速度不一样的结点进行判断,一个慢结点从首结点开始遍历,这个结点每次只遍历一个结点;一个快结点从第二个结点进行遍历,一次遍历两个结点。
若是链表中存在环,那么必然在某个结点处相遇;若是没有环,那么尾结点后继指针指向空。
LinkedListChainTest.c代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef struct operatorNodeStruce {int data;struct operatorNodeStruce* next;
}operatorNode;int main(int argc, char *argv[]) {if(argc == 1){printf("请输入链表中结点个数和环的接连位置\n");return 0;}else if(argc == 2){printf("请输入环的接连位置,负数表示没有环\n");return 0;}else if(argc > 3){printf("参数不能大于3个\n");return 0;}int nodeNumber = atoi(argv[1]);int chainNodeIndex = atoi(argv[2]);if(chainNodeIndex>nodeNumber){printf("环的接连位置应该小于链表中结点个数\n");return 0;}operatorNode *head = NULL;operatorNode *storeNode = NULL;int i=1;// 创建链表,这个链表有nodeNumber个结点for(;i<=nodeNumber;i++){operatorNode *newNode = (operatorNode *)malloc(sizeof(operatorNode));newNode->next = NULL;newNode->data = i;if(head == NULL){head = newNode;storeNode = head;}else{storeNode->next = newNode;}if(storeNode -> next != NULL){storeNode = storeNode -> next;}}//把最后一个结点的后继指针next指向第chainNodeIndex个结点,这样的话才能形成环operatorNode *chainNodeBefore = NULL;operatorNode *node= NULL;if(chainNodeIndex > 0){for(int i=0;i<chainNodeIndex;i++){if(node == NULL){node = head;}chainNodeBefore = node;node = node->next;}}storeNode->next = chainNodeBefore;// 使用快慢结点法来判断是否有环,slowNode从第一个结点开始往后遍历,每次只遍历一个结点;fastNode从第二个结点开始往后遍历,每次遍历二个结点;// 要是有环,快结点(fastNode)一定能够在某个结点处跟慢结点(slowNode)相遇operatorNode *fastNode = NULL;if(head->next != NULL){fastNode = head->next;}operatorNode *slowNode = head;while(true){if(fastNode== NULL){printf("无环\n");return 0;}else if(fastNode->next == NULL){printf("无环\n");return 0;}else if(fastNode->next->next == NULL){printf("无环\n");return 0;}else{if(slowNode == fastNode){printf("有环\n");return 0;}slowNode = slowNode->next;fastNode = fastNode->next->next;}}return 0;
}

gcc LinkedListChainTest.c -o LinkedListChainTest进行编译。
在这里插入图片描述

./LinkedListChainTest 6 4表示这个链表有6个结点,最后一个结点后继指针指向第4个结点,就像下图所示。
在这里插入图片描述

./LinkedListChainTest 7 2表示这个链表有7个结点,最后一个结点后继指针指向第2个结点,就像下图所示。
在这里插入图片描述

./LinkedListChainTest 8 3表示这个链表有8个结点,最后一个结点后继指针指向第3个结点,就像下图所示。
在这里插入图片描述

遍历解析

./LinkedListChainTest 6 4为例进行解析。
在这里插入图片描述
如上图,蓝色圆心虚线箭头为慢结点(slowNode)所在位置的标识。

在这里插入图片描述
如上图,绿色实心箭头为快结点(fastNode)所在位置的标识。

刚开始的实例图如下:
在这里插入图片描述

1次遍历之后,慢结点在第2个结点处,快结点在第4个结点处:
在这里插入图片描述

2次遍历之后,慢结点在第3个结点处,快结点在第6个结点处:
在这里插入图片描述

3次遍历之后,慢结点在第4个结点处,快结点在第5个结点处:
在这里插入图片描述

4次遍历之后,慢结点在第5个结点处,快结点在第5个结点处,可以判定有环:
在这里插入图片描述

复杂度分析

结点个数环的接连位置快结点在环中所落位置遍历次数
612、4、65
623、5、2、4、64
634、63
645、4、65
6565
6665
711、3、5、7、2、4、66
722、4、65
733、5、7、4、64
744、63
755、7、65
7665
7766

若链表中有2n(n>=1,是正整数,2n为偶数)个结点:

那么若环的连接位置x不大于n,那么遍历次数为2n-x
若是环的连接位置x大于n,则最多遍历次数小于等于2n-1,还没有总结出来公式。

若链表中有2n+1(n>=1,是正整数,2n+1为偶数)个结点:

那么环的连接位置x若不大于n+1,那么遍历次数为2n+1-x
若是环的连接位置x大于n,则最多遍历次数小于等于2n+1,还没有总结出来公式。

若是没有环的话,最多遍历次数是n/2
综上所述,最好时间复杂度和最坏时间复杂度都是O(n),平均时间复杂度也是O(n)
而空间复杂度是O(1),因为除了存储变量的必要空间,没有申请额外的空间。
因为需要更好地分析时间复杂度,所以,我把代码修改成下方所示:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef struct operatorNodeStruce {int data;struct operatorNodeStruce* next;
}operatorNode;int main(int argc, char *argv[]) {if(argc == 1){printf("请输入链表中结点个数和环的接连位置\n");return 0;}else if(argc == 2){printf("请输入环的接连位置,负数表示没有环\n");return 0;}else if(argc > 3){printf("参数不能大于3个\n");return 0;}int nodeNumber = atoi(argv[1]);int chainNodeIndex = atoi(argv[2]);if(chainNodeIndex>nodeNumber){printf("环的接连位置应该小于链表中结点个数\n");return 0;}operatorNode *head = NULL;operatorNode *storeNode = NULL;int i=1;// 创建链表,这个链表有nodeNumber个结点for(;i<=nodeNumber;i++){operatorNode *newNode = (operatorNode *)malloc(sizeof(operatorNode));newNode->next = NULL;newNode->data = i;if(head == NULL){head = newNode;storeNode = head;}else{storeNode->next = newNode;}if(storeNode -> next != NULL){storeNode = storeNode -> next;}}//把最后一个结点的后继指针next指向第chainNodeIndex个结点,这样的话才能形成环operatorNode *chainNodeBefore = NULL;operatorNode *node= NULL;if(chainNodeIndex > 0){for(int i=0;i<chainNodeIndex;i++){if(node == NULL){node = head;}chainNodeBefore = node;node = node->next;}}storeNode->next = chainNodeBefore;// 使用快慢结点法来判断是否有环,slowNode从第一个结点开始往后遍历,每次只遍历一个结点;fastNode从第二个结点开始往后遍历,每次遍历二个结点;// 要是有环,快结点(fastNode)一定能够在某个结点处跟慢结点(slowNode)相遇operatorNode *fastNode = NULL;if(head->next != NULL){fastNode = head->next;}operatorNode *slowNode = head;int chainNodetimes = 0;while(true){if(chainNodetimes != 0){printf("fastNode data:%d\tslowNode data: %d\n",fastNode->data,slowNode->data);}if(fastNode== NULL){printf("无环\n");return 0;}else if(fastNode->next == NULL){printf("无环\n");return 0;}else if(fastNode->next->next == NULL){printf("无环\n");return 0;}else{if(slowNode == fastNode){printf("循环次数:%d\n",chainNodetimes);printf("有环\n");return 0;}slowNode = slowNode->next;fastNode = fastNode->next->next;chainNodetimes++;}}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

连接器信号完整性仿真教程 七

本将介绍微带线及差分微带线仿真。做连接器信号完整性仿真时&#xff0c;有时后没法将激励端口直接设置到连接器端子上&#xff0c;这就需画出连接器PCB PAD&#xff0c;将激励端口设置在PAD的端面上&#xff0c;或者用引线连接PAD&#xff0c;将引线引出到适当的位置&#xff…

登录校验-Filter-登录校验过滤器

目录 思路 登录校验Filter-流程 步骤 流程图 登录校验Filter-代码 过滤器类 工具类 测试登录 登录接口功能请求 其他接口功能请求 前后端联调 思路 前端访问登录接口&#xff0c;登陆成功后&#xff0c;服务端会生成一个JWT令牌&#xff0c;并返回给前端&#xff0…

谷歌相册明年取消无限空间储存政策

简单介绍 据可靠消息称谷歌相册将从明年夏季也就是 2021年6月1日 开始取消无限存储容量政策。从明年夏季开始继续上传照片和视频将占用谷歌分配给用户的15 GB免费空间。 原文转载自浅行浅醉博客 原文阅读&#xff1a;点击阅读

黑客盯上了Google相册漏洞

2019独角兽企业重金招聘Python工程师标准>>> 研究人员在Google相册应用上发现了一个已修复的漏洞。有了这个漏洞&#xff0c;黑客可以使用Google相册来跟踪他们的位置历史记录。 来自互联网安全公司Imperva的Ron Masas在博客文章中解释说&#xff0c;Google相册最近…

笔记本电脑与台式机同步连接_如何将台式机与Google云端硬盘(和Google相册)同步...

笔记本电脑与台式机同步连接 Google has been doing its part to make sure everyone has a backup of important data, and it recently released a new tool for Windows and Mac users to take that redundancy to the next level. Appropriately named Backup and Sync, it…

vue查看本地相册_使用Vue.js构建的Google相册相册查看器

vue查看本地相册 google-photos-vue (google-photos-vue) Google Photos album viewer built with Vue.js. 使用Vue.js构建的Google相册相册查看器。 特征 (Features) 格式 (Formats) 照片 (Photo) Conventional grid. 常规网格。 文本 (Text) Justified layout highlighting…

复古拼贴_如何在Android上使用Google相册创建拼贴,动画或电影

复古拼贴 Google Photos is a huge improvement over Android’s old “Gallery” app, but it does a lot more than just keep your stuff organized and synced. You can easily manipulate your photos into some very cool, shareable collages, animations, and even mov…

多亏了Google相册,如何一键释放Android手机上的空间

Let’s be real here: modern smartphones have limited storage. While they’re coming with a lot more than they used to, it’s easy to fill 32GB without even realizing it. And with today’s high-end cameras, well, pictures and videos can quickly consume a bi…

如何在Android的相机应用程序中添加Google相册快捷方式

Google Photos is arguably the best photo management app on the Play Store. It’s intuitive and easy to use, has lots of useful features, and best of all, it backs up all of your images. The thing is, if you’re using a non-stock Android phone—like an LG G…

谷歌相册也不能无限白嫖了,「地主家」也烧不起免费网盘

木易 发自 凹非寺 量子位 报道 | 公众号 QbitAI 连Google都撑不住了。 Google相册宣布&#xff1a;从2021年6月1日开始&#xff0c;将停止提供免费的无限制存储空间。 这意思&#xff0c;是不让「白嫖」了&#xff1f; 不不不&#xff0c;只是不能无限白嫖了。 Google相册还是会…

android仿漫画源码、抽奖转盘、Google相册、动画源码等

Android精选源码 android实现仿今日头条的开源项目 波浪效果&#xff0c;实现流量的动态显示 美妆领域的app, 集成了摄像头取色, 朋友圈, 滤镜等 android仿漫画源码 android一个视差动画的引导页效果 Android 仿美团app头部左右切换效果 android银行卡操作步骤 Android自定义Vi…

谷歌云端硬盘 转存_如何合并多个Google云端硬盘和Google相册帐户

谷歌云端硬盘 转存 It isn’t possible to merge Google accounts directly, making it tricky to move your data from A to B. If you want to merge data across multiple Google Drive and Google Photos accounts, here’s how you do it. 无法直接合并Google帐户&#xf…

如何防止某些照片显示在Android的图库或Google相册中

Look, we get it: you don’t want every picture showing up in your gallery app on your Android phone. The thing is, there’s not an easy way to just let Gallery or Google Photos know you want to keep certain photos (or even folders) private. But there is a …

英汉汉英词典,牛津高级词典,电子词典,离线英汉,汉英词典的使用方法

1.软件准备&#xff0c;https://www.mdict.cn/wp/?page_id5227&langzh 2.mdx与mdd文件准备 3.导入&#xff0c;按照顺序来 4.选择对应的词库就可以使用了 5.使用展示 6.下载安卓版本&#xff0c;就可以在手机使用离线词典 安卓版将词典文件放在这个目录下即可

海词词典android v3.1.2新版发布 英语学习必备工具,海词词典Android V3.1.2新版发布 英语学习必备工具...

海词词典Android V3.1.2新版发布支持智能语音查词、极速智能翻译、云端生词本、在线背单词&#xff0c;集查词、在线翻译、英语学习、词典下载、单词记忆、每日学习板块等功能于一身&#xff0c;是一款深受广大英语学习者喜爱的专业免费在线词典翻译软件。 新版官方正式下载地址…

android 编程词典,基于Android的英文词典的实现方法

英文词典是手机中经常使用的应用。因此&#xff0c;在本文将结合Android来讨论如何实现一个Android版的英文词典。实现英文词典的方法很多。在本文使用了SQLite数据库来保存英文单词信息。系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息。当然&#xf…

有道手机词典

今天打开有道词典&#xff0c;无意中发现多了一行字"词典手机版更新(多款机型支持摄像头查词)"&#xff0c;oh my lady gaga,居然可以支持摄像头查词&#xff01; 于是兴冲冲的到这里下载&#xff0c;没找到我手机的型号(Nokia5530),就点了5800&#xff0c;反正都是S…

手机电子词典_论央视主持人的个人修养:习惯性纠正他人读音,手机里装着电子版词典!...

中国播音主持网公益直播 ——播音主持公开课—— 搜索关注抖音号&#xff1a;中国播音主持网 今晚七点 大咖直播嘉宾 深圳电视台 鹏远 在日常生活中&#xff0c;其实我们都会遇到某个字我们不认识的情况&#xff0c;而一般这种情况下&#xff0c;我们会选择瞎读&#xff0c;导致…

mdx格式的词典用什么软件打开_分享 | 手机词典推荐—欧陆词典(涵盖牛津、朗文等14部权威英语辞典)...

前言&#xff1a; 小编在前一篇文章中提到过&#xff1a;英语词汇学习的重点&#xff0c;是熟练掌握那些平时常见词汇的用法。在学习词汇用法的时候&#xff0c;手机词典最好具备两个优点&#xff1a;1&#xff0c;可屏幕取词&#xff1b;2&#xff0c;词典为业内权威。 小编试…