面试题----单链表带环问题

C语言版的单链表常见面试题:判断单链表是否带环,求环的长度,求环的入口 今天主要来解决一下以下几个面试题:1.判断单链表是否带环,若带环,则返回1;如何判断单链表是否带环:在这里,我们可以使用快慢指针。慢指针一次走一步,快指针一次走两步。如果带环,一定会在某个节点处快慢指针相遇;不带环,就会一直遍历到链表结束。(注意:快指针并非可以一次走任意步数,但是若带环每次走两步就一定会相遇);2.若单链表带环,求出环的长度;这个就比较easy了,在上一题的基础上,当快慢指针相遇... 阅读详情

关于单链表带环问题:1、怎样判断一个单链表是否带环;        
2、如果带环,环的长度怎么计算;
3、如果带环,怎么求环的入口;
1、怎样判断一个单链表是否带环:我们知道,单链表如果带环,那么从链表头开始遍历就会进入死循环。其实我们可以用上篇博客中提到的两个指针移动的思想来求解,在这里可以让两个指针移动速度不同,首先令两个指针fast和slow同时指向链表头部,然后每次使fast走两步(fast和slow不规定必须走几步,只要fast比slow走的快就可以),使slow走一步,只要链表中有环,那么fast和slow总会相遇。
2、如果带环,环的长度怎么计算:首先利用1我们可以得到fast和slow的第一次相遇,把它标记起来,给一个变量length,让它初始为0,然后继续让fast和slow向后走,每走一次length加一,等到它们再次相遇的时候,得到的length就是环的长度。
3、如果带环,怎么求环的入口:同样利用1得到fast和slow第一次相遇,然后分别在链表头和相遇点各设一个指针,两个指针每次都向后走一步,再次相遇的点(相遇的第一个点)就是环的入口点。
下面我用一张图来模拟一下判断是否带环时指针移动的过程,后面两个问题大家可以自己画图验证一下,看能不能得到想要的结果。

下面附上代码:

bool IsLoop(Node* pHead)        //判断一个链表是否带环
{
	if(pHead == NULL)
		return false;
	
	Node* fast = pHead;
	Node* slow = pHead;

	while(fast != NULL && fast->_next != NULL)     //如果不带环,则fast先走到NULL
	{
		fast = fast->_next->_next;
		slow = slow->_next;
		if(fast == slow)
			break;
	}
	if(fast != NULL && fast->_next != NULL)
		return true;
	else
		return false;
}

size_t LoopLength(Node* pHead)    //求链表中环的长度
{
	if(pHead == NULL)
		return 0;

	if( !(IsLoop(pHead)) )
		return 0;

	Node* fast = pHead;
	Node* slow = pHead;
	size_t length = 0;
	bool firstmeeting = false;

	while(1)
	{
		fast = fast->_next->_next;
		slow = slow->_next;

		if(fast == slow && firstmeeting == true)  //第二次相遇
			break;
		if(fast == slow && firstmeeting == false )   //第一次相遇
		{
			firstmeeting = true;
		}
		if(firstmeeting)
			length++;
	}
	return length;
	
}

Node* FindLoopEntrance(Node* pHead)    //求环的入口点
{
	if(pHead == NULL)
		return NULL;
	if( !(IsLoop(pHead)) )
		return NULL;

	Node* fast = pHead;
	Node* slow = pHead;

	while(1)
	{
		fast = fast->_next->_next;
		slow = slow->_next;

		if(fast == slow)
		{
			slow = pHead;
			break;
		}
	}
	while(1)
	{
		fast = fast->_next;
		slow = slow->_next;

		if(fast == slow)
			break;
	}
	return slow;
}


搞懂单链表常见面试题 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 《剑指 offer》 ,有的来自《程序员代码面试指南》,有的来自 leetCode,不是很全面,但都具有一定代表性,相信大家看完以后一定跟我一样,对面试的时候算法题又多了一份自信。 什么是单链表 链表(Linked list)是一种常... 阅读详情

相关推荐

Multisim新手必看:从零搭建数字时钟仿真电路(附完整原理图)

本文详细介绍了如何使用Multisim从零开始搭建数字时钟仿真电路,涵盖晶振电路设计、计数电路实现、校时功能配置等关键步骤。通过完整的原理图和实用技巧,帮助新手快速掌握Multisim仿真设计,实现精准的数字时钟功能。

ios99的博客 328

一:单链表——⑤带环单链表的详细讲解

  今天看了一篇关于带环单链表精讲的文章,在这里给大家做一个总结。之前看过很多有关单链表带环的文章,但是有些文章讲的太文章化,不容易理解,理论性太强。接下来我会用最简单通俗易懂的语言解析这个问题。   当你拿到一个单链表的数据信息时,我相信大部分的人都会选择去判断一下这个单链表是否有环?这也是最基本的反应。下面我给出单链表的数据结构: typedef int Elemtype; //头节...

genzld的博客 1706

软考中级信息系统监理师(第二版)-第21章基础设施工程监理

由于网络信息技术的飞速发展,变化日新月异,网络设计不但要保证目前网络传输容量的要求,也要考虑今后网络的发展,满足当前以及今后相当一段时间内的网络需求,便于向新技术的升级和衔接,同时又需要保护原有的投资。通用布缆系统工程中,承建单位的竣工文档主要包括以下内容:承建合同,招标文件,投标文件,设计方案,工程实施组织设计方案,工程施工报告,隐蔽工程记录,变更记录,自测报告,信息点分布图(表),园区、楼宇、水平配线表,楼层平面图及无线设备点位图,无线设备信息表,竣工图纸等。多排安装时,列间距不应小于1200mm。

2301_78583973的博客 1400

关于单链表带环的一系列问题

题目 1、判断一个单链表是否带环 2、求取一个带环单链表的环的长度 3、求取一个带环单链表的环的入口 4、判断两个不带环单链表是否相交 5、求取两个不带环单链表的一个公共节点 这仅仅一个单链表是否带环可以拓展出这么多的问题,我们来一个一个解决 1、判断一个单链表是否带环。 思路 记得以前做过这个,可以用快慢指针,两个指针同时指向头结点,快指针一次走两个,慢指针一次走一个,

夫唯不争,故天下莫能与之争。 1714

深度解读扫地机器人的导航原理

科技改变生活,不可否认科技的进步的确为我们的生活带来许多便捷,以智能家电为例,智能电饭煲、智能洗碗机、智能扫地机等产品已逐渐成为家庭的一分子,其中以扫地机表现最为抢眼。能做到智能规划清扫,收割了不少家庭主妇及科技爱好者的芳心。但扫地机并非一开始就这么智能,最初的扫地机只能做到随机式清扫,会频繁出现碰撞现象。 近年来,通过业界的不断努力,目前,扫地机器人已告别乱碰乱撞现象,能做到自主路径...

qq_38403231的博客 6505

用 Python 和 uiautomation 实现微信批量发送

思路是这样,将要发送的人员名单(包括称呼)以及发送内容都维护到Excel里,程序运行时读取Excel里内容,自动搜索人员姓名(微信昵称或备注名),填入要发送的内容,拼接上称呼(如果需要的话)自动点击发送,这样轮巡直至名单人员全部发送完成。、

jankingdom的专栏 1471

链表——带环问题

判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算每个算法的时间复杂度&空间复杂度 分析:不带环fast指针可以走到尾,带环则走不到;若带环fast指针一次走两步,slow指针一次走一步。(fast和slow的间距会逐渐缩小,一次缩小1,不会错过,其余走法可能会跳过,或者构成死循环);入口点:第二次的相遇点 ListNode* IsHaveLoop(ListNode* pli

DREAMonce_的博客 494

告别Sourceforge安装器!手把手教你下载MinGW-w64离线包并配置环境变量(Windows 10/11)

本文详细介绍了如何在Windows 10/11系统上通过下载MinGW-w64离线包并配置环境变量,完全绕过Sourceforge安装器的问题。从选择正确的版本、解压到本地目录,到设置系统环境变量和验证编译环境,手把手指导开发者快速搭建稳定的GCC编译环境,解决常见的安装困扰。

weixin_30896825的博客 336

链表常见面试题三:解决链表带环问题

问题1:判断链表是否带环解题思路:用两个指针,快指针一次走两步,慢指针一次走一步,如果两指针相遇,那么链表带环,若两指针不相遇,则链表不带环。pLinkNodeCheckCycle(pListhead) { pLinkNodefast=head; pLinkNodeslow=head; while(fast&&fast->ne...

weixin_34309435的博客 172

使用网分对晶体ESR/L1/C1/C0进行测量计算

Use R&S Vector Network Analyzer test XTAL ESR/L1/C1/C0 測量方法:使用儀器的Port1端口,測量XTAL的S11,通過諧振的參數計算出ESR/L1/C1/C0的值。 實際晶體的等效模型:通常方便晶體分析,使用下圖(b)的等效模型,但實際測量發現晶體存在多個串聯諧振點,實際等效模型更接近(c)。 儀器測量到的S11,其中M...

qq_39138630的博客 2085

论文阅读:2024 ACM CCS “Do Anything Now”: Characterizing and Evaluating In-The-Wild Jailbreak Prompts on

大语言模型(LLMs)的滥用问题引起了公众和大语言模型供应商的高度关注。有一种特殊的对抗性提示,叫做越狱提示,它已成为绕过防护措施、让大语言模型生成有害内容的主要攻击手段。在这篇论文中,作者使用新框架JailbreakHub,对2022年12月至2023年12月期间的1405个越狱提示进行了全面分析。作者识别出131个越狱提示社区,发现了越狱提示的独特特征以及主要攻击策略,比如提示注入和权限提升。

CSPhD-winston的博客 1414

链表带环问题

1、判断链表是否带环基本思路:定义两个指针,一个快指针,一个慢指针,快指针一次走两步,慢指针一次走一步,当两个指针重合的时候,说明该链表是带环的,当快指针为空或者快指针的下一个节点为空,说明是不带环的。 代码实现/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *

LP9127的博客 552

uniapp [全端兼容] - 详细实现下拉筛选菜单功能组件,下拉式筛选菜单效果,类似电商美团点击筛选项底部弹出列表点击选择后自动收起(详细示例代码,全端兼容小程序、安卓苹果app、h5网页、nvue

uni-app,vue2,vue3,向下弹出菜单包含筛选功能,日期筛选,下拉框选择器,下拉多条件筛选,下拉式筛选菜单,uniApp如何实现条件下拉筛选,Uniapp官方条件筛选组件,下拉框式条件筛选插件组件,最好用的插件组件,多端兼容,下拉菜单筛选,过滤筛选列表,下拉筛选栏,多列联动的条件筛选,下拉菜单地区和筛选,微信小程序,支付宝小程序,h5网页,移动端网站,安卓app,苹果app,nvue,uniapp所有平台兼容,下拉菜单筛选,下拉式条件筛选,下拉列表,点击排序,级联筛选,uniapp实现下拉筛选

🏆 前端领域优质创作者 1万+

【单链表面试题】-----链表带环问题

判断单链表是否带环,并求得相遇点 思路:快慢指针问题,(前面已经讲过快慢指针原理,在这里不再详细描述) 当快指针比慢指针多走一步,在某个环内一定会相遇在某一点;反过来则有:当两个快慢指针在某一点相遇,这个链表一定是带环的链表,反之不带环(具体过程如图) 具体代码: //链表是否带环(并返回相遇点) SListNode* SListIsCircle(SListNode* list...

zhangye3017的博客 385

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

带环单链表求中点

最近一直在无脑敲代码,结果今天下午被一个准备各种面试题的同学问了一个带环单链表的问题,发现最近的智商真心不够用,想了稍长时间,最后算是想明白了。因为最后想到头大的时候,百度了一下,所以只好选择分类为转载,下面就建立在自己思考的基础上,讲解一下,如又不对的地方,望指正。 首先,对于一个n节点的单链环,如果给定一个开始节点n0,然后用a,b两个指针,分别以1和2的步长遍历,那么在a环

wenph2008的专栏 676

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

判断一个单链表是否有环及环的链接点

昨天面试的时候被问到这道题了,完全没答上来,学校的知识都还给老师了,回来百度了一下

probie 2096

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

带环单链表(更新)

最近一直在无脑敲代码,结果今天下午被一个准备各种面试题的同学问了一个带环单链表的问题,发现最近的智商真心不够用,想了稍长时间,最后算是想明白了。因为最后想到头大的时候,百度了一下,所以只好选择分类为转载,下面就建立在自己思考的基础上,讲解一下,如又不对的地方,望指正。 首先,对于一个n节点的单链环,如果给定一个开始节点n0,然后用a,b两个指针,分别以1和2的步长遍历,那么在a环了多少圈

1168

单链表的一些经典面试题

今天在一本试题书上看到一些特别好的单链表面试题,大家都知道单链表容易在头节点处进行删除,在尾节点处进行插入,下面我们就来讨论一下这些面试题:  (一)删除一个非尾节点:  题目要求的是要删除一个不是尾节点的节点,要删除一个节点我们首先得知道是那个链表,是哪个节点节点,找到并且删除它。所以我们设计的函数是这样的:void DelNotTailNode(SListNode* pos) { asser

如风 1397

链表面试题(三):链表相交,链表带环,链表带环相交

接上一篇链表面试题博客: 11. 判断单链表是否带环?若带环,求环的长度?求环的入口点? 1)带环判断:定义两个指针,pFast、pSlow,其中两指针速度pFast = 2pSlow ,若带环总会有pFast == pSlow,并返回相遇节点,若不带环 这个指针的最后节点都为空。 2)求环的长度,定义计数器、 保存当前相遇节点、从相遇节点开始遍历,计数器计数,当再次与相遇节点相遇时 ,计数

Begin 604

链表经典面试题02--链表的带环问题

中均有详细讲解,大家可以先看看,这里就不过多介绍,简而言之就是定义两个指针,一个为慢指针,一次走一步,一个为快指针,一次走两步,当它们两个相遇时,即为环形链表,快慢指针法在链表中很常见,大家一定要牢牢掌握.当slow进入环中,fast和slow相距为N,现在fast要追slow,fast每次二步,slow每次一步,每追击一次,它们两个的距离就减一,直到它们两个相遇,所以它们两个一定会相遇.我们知道,在不带环链表中,它们两个永远都不会相遇,所以我们只需要在带环链表中去证明。指针再次到达,则链表中存在环。

wer24_25的博客 1426

龟兔赛跑判断链表是否带环

今天,我们来看一道非常有趣的腾讯面试题,题目如下:有一个单链表,已知其头指针,判断它是否带环?要求时空复杂度尽可能低。显然,我们首先自然要清楚,什么是不带环的单链表?什么是带环的单链表?不带环的单链表很常见,比如:带环的单链表不太常见,比如:如果你还处于懵圈的状态,那也不要着急哦。比赛的赛道总应该见过吧,且看直赛道和环赛道:直赛道环赛道接下来,我们来判断赛道是否带环,请注意要求:时间复杂度和空间复杂度尽可能低。

2401_83384536的博客 447

链表带环问题1

给出一个链表; 1.判断其是否带环? 2.如果带环求环的长度? 3.求环的入口节点? 解题思路: 用两个指针,快指针一次走两步,慢指针一次走一步,如果两指针相遇,那么链表带环,若两指针不相遇,则链表不带环。 带环的几种情况: Node* List::find_meet_node(Node* Head) { if(Head==NULL) return N

喵喵的博客 691

基于单链表的面试题——进阶篇

点击查看如何实现单链表以及单链表的一些基本操作函数 点击查看基于单链表经常见的面试题——基础篇1.判断单链表是否带环?若带环,求环的长度?求环的入口点? 判断是否带环:ListNode *IfRing(ListNode *list)//判断单链表是否带环,返回交点 { ListNode* slow = list; ListNode* fast = list; //是否带环

Quinn0918的博客 1176

单链表的几道经典面试题(2)

1.判断单链表是否带环2.计算环的长度3.求环的入口4.判断两个链表是否相交,若相交求交点(默认链表不带环)5.判断两个链表是否相交,若相交求交点(链表可能带环)6.找两个已排序链表的相同部分7.复杂链表拷贝判断单链表是否带环方法一:将每个节点保存到顺序表中,再将每个节点遍历,看是否带环。但是这种方法的时间复杂度为O(n^2),所以,又想出了一种方法,来优化第一种方法,来使时间复杂度变为O(n)方...

L_X_Y_HH的博客 275

单链表OJ题练习讲解

大家好!欢迎来到小鸥的博客~数据结构_海盗猫鸥的博客-优快云博客在前面的博客中我们已经讲解过了单链表的相关知识,并使用单链表实现了简易的通讯录。本期我们就来一起做几道单链表相关的OJ题吧!(附题目链接和参考代码)

海盗猫鸥的博客 1021

单链表的相关面试题

单链表的头插,尾插,删除,查找。约瑟夫环及求环的长度,判断单链表是否相交以及交点,单链表的逆序/正序打印。两个有序单链表的合并。

Silence723的博客 500
上一篇: 查找单链表中倒数第k个节点
下一篇: 面试题----判断两个链表是否相交(可能带环)
run_bear
博客等级 码龄10年 113粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值