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


相关推荐

  • 单片机led点阵显示程序_LED点阵

    单片机led点阵显示程序_LED点阵单片机LED点阵一、简述     使用8×8LED点阵显示汉字。向上滚动"中华"两个汉字。   文件打包:链接:https://pan.baidu.com/s/1oHSAIY6qVA7qFFWUvMvJEA密码:snyg二、效果三、工程文件结构1、Keil工程2、仿真电路图四、代码88led.c文件#include<reg51.h>#defineuintunsigne…

    2022年10月22日
    1
  • 华为交换机关闭网口_华为交换机如何关闭端口号

    华为交换机关闭网口_华为交换机如何关闭端口号华为交换机怎样把端口从vlan中删除??答:通过displayvlan查看当前vlan列表通过displayvlanvlan-id比如displayvlan100,查看vlan100的状态,里面列出vlan100里有哪些端口,有哪些端口为untagged或者tagged也可以通过displaycur查看配置来得出还有查看端口状态displayinterface。通过display…

    2022年7月20日
    156
  • 情感词典构建_晦涩情感词典

    情感词典构建_晦涩情感词典看到一篇文章写的很清楚简洁,直接转了。————————————————————————————————————————某主席说,“没有情感词典的“使用该情感词典进行情感分析”都是耍流氓。”某帝说,“要有情感词典。”

    2022年8月23日
    3
  • 解决启动IIS发生意外错误 0x8ffe2740「建议收藏」

    解决启动IIS发生意外错误 0x8ffe2740「建议收藏」有时候也不知怎么搞的,你会突然间发现你的IIS启动不了了,提示“发生意外错误0x8ffe2740”这样的东东主要原因是80端口被程序占用了,请确认一下有没有程序占用了80端口,不知道怎么确认?可以用TcpView查看占用的端口然后终止这人端口其实大多情况下都是因为Xunlei或者数据库(SqlServer,Oracle)占用了,所以先把X…

    2022年7月26日
    3
  • 圣杯布局、双飞翼布局、Flex布局和绝对定位布局的几种经典布局的具体实现示例

    圣杯布局、双飞翼布局、Flex布局和绝对定位布局的几种经典布局的具体实现示例题目要求:针对如下DOM结构,编写CSS,实现三栏水平布局,其中left、right分别位于左右两侧,left宽度为200px,right宽度为300px,main处在中间,宽度自适应。要求:允许增加额外的DOM节点,但不能修改现有节点顺序。<divclass="container">  <divclass="main">main</div>  <divclass="

    2022年6月29日
    23
  • Pycharm使用技巧——自动调整代码格式汇总!自动化神器!

    Pycharm使用技巧——自动调整代码格式汇总!自动化神器!代码自动填充了空格问题在使用pycharm的代码编辑器时,常常懒得写空格,如下图,但这是不符合代码规范的,而且也会影响可读性。解决方法pycharm有自动调整代码格式的快捷键,默认为Alt+Ctrl+L,按下快捷键后,代码自动填充了空格。自动对齐代码问题在使用pycharm的代码编辑器时,有点时候copy的代码的没有按照代码格式对齐,如下图,但这是不符合代码规范的,而且也会影响可读性。解决方法pycharm有自动调整代码格式的快捷键,默认为Alt+Ctrl+L

    2022年8月27日
    24

发表回复

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

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