菜鸟系列之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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gg修改器内购_gg修改器版本大全

    gg修改器内购_gg修改器版本大全时空猎人--各种修改提供人:我不特别首先下载GG修改器;准备好一个免root框架,安装好了后,打开免root框架把游戏和GG修改器添加到框架里面腾讯版的时空猎人,不需要过保护,选择进程就行,内存选择单个CA然后左下角保存这里教大家一个方法进入游戏,出现签到奖励版面,什么都不要动,打开gg,搜索你要的值,比如伤害数据0.12就搜索0.12最好不要锁定不然会出现无效情…

    2022年9月4日
    2
  • 网络传真的安装及使用方法「建议收藏」

    网络传真的安装及使用方法「建议收藏」在宽带网迅速普及的今天,Modem好像已经“廉颇老矣”,传真Modem已变成了一块“食之无味,弃之可惜”的鸡肋。而且windows的传真模块,已经远远无法满足今天人们快节奏的工作效率。在国外已经非常普遍的网络传真(efax),终于来到了国内,从2004年的引进到根据国内人们使用习惯的不断改进,近10年来,已拥有了百万级的客户群体,特别是近年来,传真营销被企业广泛应用,带来了越来越多的垃圾传

    2022年6月28日
    47
  • android之获取应用中的图片资源_获取找你妹中的图片资源

    一直不知道原来获取一个应用中的图片资源这么简单,刚才直接把apk解压,就得到了里面的一下文件,搜索一下就全部把图片资源找出来了,想要模仿应用或者自己不会ui的话,用现成的资源方便多了.也没多少说的,直接解压就行了,根据存放路径很容易就找到了.分享一下找你妹的图片资源.点击打开链接

    2022年3月10日
    35
  • 今天的学习[通俗易懂]

    今天的学习[通俗易懂]今天的学习

    2022年4月21日
    41
  • 2022.01 pycharm 激活码【中文破解版】

    (2022.01 pycharm 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0H…

    2022年3月31日
    61
  • fferrone_png转换svg

    fferrone_png转换svgffmpeg-vcodecrawvideo-frawvideo-pix_fmtbgr32-s1792x2176-i~/Downloads/dumpdata/dump_src_44_0_f2_1792x2176.raw-fimage2-vcodec pngscreenshot1.png颜色不对一般是RGB的值有问题 PIX_FMT_RGB24改成PIX_FM

    2022年9月25日
    0

发表回复

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

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