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

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

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

找含单链表的环入口点

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

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

 分析:设一快一慢两个指针(Node *fast, *low)同一时候从链表起点開始遍历,当中快指针每次移动长度为2。慢指针则为1。则若无环,開始遍历之后fast不可能与low重合,且fast或fast->next终于必定到达NULL;若有环。则fast必定不迟于low先进入环,且因为fast移动步长为2,low移动步长为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,环入口点到问题1中fast与low重合点的距离为y。又设在fast与low重合时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从链表起点处開始遍历,指针p2从encounter处開始遍历,且p1和p2移动步长均为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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python中griddata的外插值_SciPyTutorial-多元插值griddata

    python中griddata的外插值_SciPyTutorial-多元插值griddata11.ScipyTutorial-多维插值griddatascipy.interpolate模块下的griddata函数可以处理多元(维)函数的插值,以二元函数$f(x,y)$为例说明一下griddata的使用。与之前的一元函数插值interp1d相区别,interp1d是通过已知的点集$P={(x_i,y_i)|x_i\inR,y_i\inR}$通过interp1d可以找…

    2022年5月26日
  • httpClient写简单的get请求访问百度网址和Springmvc本地controller

    httpClient写简单的get请求访问百度网址和Springmvc本地controller

    2021年7月19日
  • 文件读写api函数是什么_c语言文件的读和写

    文件读写api函数是什么_c语言文件的读和写文件操作API函数详解在VC中,大多数情况对文件的操作都使用系统提供的API函数,但有的函数我们不是很熟悉,以下提供一些文件操作API函数介绍:一般文件操作APICreateFile打开文件要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。ReadFile从文件中读取字节信息。在打开文件获得了文件句柄之后,则

    2022年10月26日
  • Android应用开发揭秘

    Android应用开发揭秘《Android应用开发揭秘》                                              ///////http://www.iteye.com/wiki/hzbook/2249-Android  书名:Android应用开发揭秘作者:杨丰盛出版社:机械工业出版社ISBN:9787111291954出版日期:2010年3月(1版2次)…

    2022年4月28日
  • substance painter anchor point快速教程

    substance painter anchor point快速教程这个功能方便在substancepainter里通过normal和height实时影响污迹图来做细节但是步骤有些略麻烦,下面作为笔记也作为一个小教程首先需要实时绘制的图层必须在污迹图的下面可以在图层上直接绘制右击加上anchorpoint然后需要被影响的图层或是mask里面的generation,必须开启microDetails如果你需要绘制的高度图影响细…

    2022年10月8日
  • 从TCP协议的原理来谈谈rst复位攻击[通俗易懂]

    从TCP协议的原理来谈谈rst复位攻击[通俗易懂]在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。1、TCP是什么?TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用土语解释下上

    2022年9月27日

发表回复

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

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