微软面试(or电面)试题——如何判断一个单链表是否存在回路
来源:互联网 发布:ubuntu 16.04 ip配置 编辑:程序博客网 时间:2024/06/10 15:03
首先,我们想一下:如果单链表中有回路,它会是什么样子的?回答这个问题,需要知道,如果,我们把next指针看成是一个有向边,结点看成是图的vertex,那么,对于每个node,其out-degree=1.
所以,对于有cyle的单链表,其“模样”必然为这个样子:
红色的部分都是不可能出现的,因为,如果出现了,红色和黑色“交界”处的那个node的out-degree就不是1!!!(proof by contradiction)
以上是其大致的形状,然后,我们考虑,如何解决这个问题呢?
一个已知的解法是,设置两个pointer:pointer1的步长为1,pointer2的步长为2.
也就是说:pointer1=pointer1.next; pointer2=pointer.next.next;
当然,pointer2首先进入cycle中,pointer1后进入cycle。一旦pointer1进入到了cycle,point1&2都只会在cycle中"转圈"了。
pointer2的速度为“2”,pointer1的速度为“1”,相对速度delta为1.
所以,将pointer1作为“参照物”,pointer2必然会赶上pointer1,并与其相遇。
可能会有人问,步长的delta只能为1吗?当然不是。
原理是:假设赶上pointer1的所用的时间为k,那么k=(m*cycle+pointer1进入时,pointer2和pointer1的距离)/delta。
当delta为1时,m可以为0;如果delta大于1,m为第一个能满足(m*cycle+pointer1进入时,pointer2和pointer1的距离)被delta整除的值,弄得不好,会大于1的。
- 微软面试(or电面)试题——如何判断一个单链表是否存在回路
- 如何判断一个图中是否存在回路
- 如何判断一个图中是否存在回路
- 如何判断一个图中是否存在回路
- 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
- 腾讯面试题----判断一个数是否存在(大数据方面)
- 判断有向图是否存在回路—拓扑排序
- poj1637 判断一个混合图是否存在欧拉回路
- 面试题四 C/C++面试秘笈 之判断链表是否存在环形链表问题-程序员面试题
- 判断数组中是否有重复的数——微软面试题
- 如何判断一个链表中是否有环(百度面试题)
- 如何判断一个文件是否存在
- bash如何判断一个文件是否存在
- 如何判断一个featureclass是否存在
- sql 如何判断一个表是否存在
- 如何判断一个单链表中是否存在环
- [面试题] 判断一个单链表是否有环
- bellman-ford算法——最短路问题,判断是否存在负权回路或正权回路
- UIWebView字体根据手势放大,并让其大小根据字体多少排布
- NSString+NSMutableString+NSValue+NSArray用法汇总
- Boost下载安装编译配置使用指南(含Windows和Linux)
- 字符串比较 忽略大小写 iphone
- 元素事件列表说明
- 微软面试(or电面)试题——如何判断一个单链表是否存在回路
- 6.1 传统控件
- 如果我不主动理你,你是不是准备一辈子也不主动理我了…写的很实在
- 显示大量图片 iphone
- 常用 U-boot命令详解
- ArrayList、LinkedList、Set、HashMap的简单介绍
- msn机器人删除联系人的函数
- 1.5.1 Number Triangles
- Memcache基础教程