菜鸟系列之C/C++经典试题(七)「建议收藏」

菜鸟系列之C/C++经典试题(七)

大家好,又见面了,我是全栈君。

找含单链表的环入口点

  问题1:怎样推断单链表中是否存在环(即下图中从结点E到结点R组成的环)?

菜鸟系列之C/C++经典试题(七)「建议收藏」

 分析:设一快一慢两个指针(Node *fast, *low)同一时候从链表起点開始遍历,当中快指针每次移动长度为2。慢指针则为1。则若无环,開始遍历之后fast不可能与low重合,且fastfast->next终于必定到达NULL;若有环。则fast必定不迟于low先进入环,且因为fast移动步长为2low移动步长为1,则在low进入环后继续绕环遍历一周之前fast必定能与low重合(且必定是第一次重合)。于是函数可写例如以下:

bool hasCircle(Node* head, Node* &encounter)
{
	Node *fast = head, *slow = head;
	while(fast && fast->next)
	{
		fast = fast->next->next;
		slow = slow->next;
		if(fast == slow)
		{
			encounter = fast;
			return true;
		}
	}
	encounter = NULL;
	return false;
}

问题2:若存在环,怎样找到环的入口点(即上图中的结点E)?

解答:如图中所看到的。设链起点到环入口点间的距离为x,环入口点到问题1fastlow重合点的距离为y。又设在fastlow重合时fast已绕环n周(n>0),且此时low移动总长度为s,则fast移动总长度为2s。环的长度为r。则
        s + nr = 2s,n>0       ①
        s = x + y              ②
       
式得  s = nr                
       
代入式得
       nr = x + y
       x = nr – y               ③
       
现让一指针p1从链表起点处開始遍历,指针p2encounter处開始遍历,且p1p2移动步长均为1。则当p1移动x步即到达环的入口点,由式可知,此时p2也已移动x步即nr – y步。

因为p2是从encounter处開始移动。故p2移动nr步是移回到了encounter处,再退y步则是到了环的入口点。也即,当p1移动x步第一次到达环的入口点时。p2也恰好到达了该入口点。于是函数可写例如以下:

Node* findEntry(Node* head, Node* encounter)
{ 
	Node *p1 = head, *p2 = encounter;
	while(p1 != p2)
	{
		p1 = p1->next;
		p2 = p2->next;
	}
	return p1;
}

原文来自:http://blog.csdn.net/wuzhekai1985/article/details/6725263

有错误欢迎提出, 分享请标明出处, 谢谢!

感觉好的话就顶一个。 感觉不错的话就踩一个。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116061.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 腾讯课堂视频下载_电脑腾讯会议不支持虚拟背景

    腾讯课堂视频下载_电脑腾讯会议不支持虚拟背景如果想把腾讯课堂里的视频下载到本地,这里提供一个方法。原理就是通过提取网页中的视频链接,进行下载。提取网页中的视频链接方法有很多。这里介绍通过浏览器插件的方式。1.我是在firefox附加组件里搜索“视频下载”找到的一款插件。flashvideodownloader,安装即可2.打开腾讯课堂网页版,播放想要下载的视频。浏览器会缓存你播放的视频,一般是5分钟一个。3.打开浏览器插件,它就会显示…

    2025年8月15日
    4
  • window openJdk 下载「建议收藏」

    window openJdk 下载「建议收藏」windowopenJDK下载

    2025年6月11日
    5
  • 什么是跨域访问「建议收藏」

    什么是跨域访问「建议收藏」1.什么是跨域跨域是指跨域名的访问,以下情况都属于跨域:跨域原因说明示例域名不同www.jd.com与www.taobao.com域名相同,端口不同www.jd.com:8080与www.jd.com:8081二级域名不同item.jd.com与miaosha.jd.com如果域名和端口都相同,但是请求路径不同,不属于跨域,如:www….

    2022年5月25日
    52
  • 通过优启通制作U盘启动安装Windows系统「建议收藏」

    通过优启通制作U盘启动安装Windows系统「建议收藏」通过U盘启动安装Windows系统(一)制作启动项,拷贝镜像(EASYU软件)通过EASYU(优启通),制作启动盘,启动盘制作成功之后,在优启通主界面,模拟测试,选BIOS测试,若能进入,将win7的GHO镜像文件放入U盘.运行优启通点击“归还空间”,分区格式选择NTFS,点击“全新制作”。(UEFI和NTFS的区别在于,UEFI格式的启动盘不能放大于4G的GHO镜像文件,NTFS可以放大于4G的GHO镜像文件或者ISO镜像文件)制作完要检验一下启动盘是否制作成功,可

    2022年6月25日
    77
  • git clone 显著提速,解决Github代码拉取速度缓慢问题[通俗易懂]

    git clone 显著提速,解决Github代码拉取速度缓慢问题[通俗易懂]对于国内用户来说,搬砖遇到clone Github速度十分缓慢的问题实在是一个令人头疼崩溃的问题。下面就介绍一个简单的方法很好的解决这个问题。方法:   1、注册码云账号   传送门   2、注册完成后点击页面右上角的“+” 号,选择新建项目创建新项目     3、在新页面中选择“导入已有项目”导入已有项目    4、复制需要导…

    2022年7月21日
    14
  • 修改phpstorm的字体样式和大小

    修改phpstorm的字体样式和大小

    2021年10月15日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号