【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点

【试题描述】定义一个函数,输入一个链表,判断链表是否存在环路,并找出回路起点

Circular linked list: A (corrupt) linked list in which a node’s next pointer points to an
earlier node, so as to make a loop in the linked list
EXAMPLE
Input: A -> B -> C -> D -> E -> C [the same C as earlier]
Output: C

 

If we move two pointers, one with speed 1 and another with speed 2, they will end up meet-ing if the linked list has a loop Why? Think about two cars driving on a track—the faster car
will always pass the slower one!
The tricky part here is finding the start of the loop Imagine, as an analogy, two people rac-ing around a track, one running twice as fast as the other If they start off at the same place, when will they next meet? They will next meet at the start of the next lap

Now, let’s suppose Fast Runner had a head start of k meters on an n step lap When will they next meet? They will meet k meters before the start of the next lap (Why? Fast Runner would have made k + 2(n - k) steps, including its head start, and Slow Runner would have made n - k steps Both will be k steps before the start of the loop )
Now, going back to the problem, when Fast Runner (n2) and Slow Runner (n1) are moving around our circular linked list, n2 will have a head start on the loop when n1 enters Specifi-cally, it will have a head start of k, where k is the number of nodes before the loop Since n2 has a head start of k nodes, n1 and n2 will meet k nodes before the start of the loop

So, we now know the following:
1   Head is k nodes from LoopStart (by definition)
2   MeetingPoint for n1 and n2 is k nodes from LoopStart (as shown above)
Thus, if we move n1 back to Head and keep n2 at MeetingPoint, and move them both at the
same pace, they will meet at LoopStart

分析:为何能够找到环的起始位置?

假设环的长度是 m, 进入环前经历的node的个数是 k , 那么,假设经过了时间 t,那么速度为2 的指针距离起始点的位置是:  k + (2t - k) % m = k + (2t - k) - xm . 同理,速度为1的指针距离起始点的位置是 k + (t - k) % m = k + (t - k) - ym。

如果 k + (2t - k) - xm =  k  + (t - k) - ym ,可以得到 t = m (x - y)。 那么当t 最小为m的时候,也就是说,两个指针相聚在 距离 起始点 m - k的环内。换句话说,如果把一个指针移到链表的头部,然后两个指针都以 1 的速度前进,那么它们经过 k 时间后,就可以在环的起始点相遇。

【参考代码】

 1     public static boolean judgeList(LinkList myList)
 2     {
 3         Link fast, slow;
 4         fast = slow = myList.first;
 5         while (true)
 6         {
 7             if (fast == null || fast.next == null)
 8                 return false;
 9             else if (fast == slow || fast.next == slow)
10                 return true;
11             else
12             {
13                 slow = slow.next;
14                 fast = fast.next.next;
15             }
16         }
17     }

 

 1     public static Link FindBeginning(LinkList myList)
 2     {
 3         Link fast, slow;
 4         fast = slow = myList.first;
 5         while(fast.next !=null)
 6         {
 7             slow = slow.next;
 8             fast = fast.next.next;
 9             if(slow == fast)
10                 break;
11         }
12         
13         if(fast.next == null)
14             return null;
15         /* Move slow to Head. Keep fast at Meeting Point. Each are k steps
16         /* from the Loop Start. If they move at the same pace, they must
17          * meet at Loop Start. */
18         slow = myList.first;
19         
20         while(slow!=fast)
21         {
22             slow = slow.next;
23             fast = fast.next;
24         }
25         
26         return fast;
27     }

 

转载于:https://www.cnblogs.com/WayneZeng/archive/2013/04/11/3015220.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯机器人实验室首曝光 攻坚“通用人工智能”

来源:新浪科技摘要:与当初的“互联网”一样,“AI”正成为各行各业的标配。在近日召开的2018 世界人工智能大会上,腾讯董事会主席兼首席执行官马化腾提出,人工智能技术是一场跨国、跨学科的科学探索工程,对于…

Android之canvas详解

首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e…

下一代动力电池深度报告,三大技术路线谁能笑到最后?【附下载】| 智东西内参...

来源:智东西编辑:智东西内参摘要:随着全球电动车浪潮席卷,关于固态电池的新闻越来越多。从 Fisker 宣称开发充电 1 分钟行驶 500 公里的固态电池,到宝马已与 SolidPower 进行合作开发下一代电动车用固态电池&#xff0…

Android之shape属性详解

有时候 ,为了满足一些需求,我们要用到 shape 去定义 一些背景,shape 的用法 跟图片一样 ,可以给View设置 Android:background”drawable/shape”, 定义的shape 文件,放在 res/shape 目录下 通常我们可以用shape 做 bu…

S3C6410移植u-boot-2010.3(2)基本的启动信息修改

1、启动模块修改 进入/cpu/arm1176/目录,修改start.S文件 首先找到需要修改的CONFIG_NAND_SPL汇编原码,修改如下: #ifndef CONFIG_NAND_SPL /** flush v4 I/D caches*/ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p1…

[修订版]”大脑“爆发背后是50年互联网架构重大变革

前言:面对即将到来的2019年,互联网诞生50年将是诸多纪念活动中重要的一个,经过50年的发展,互联网究竟发生什么重要的变化,通过这篇文章试图进行一次总结,也提前向互联网50年致敬。作者:刘锋 互…

智慧城市建设:科技创业的下一个浪潮

来源:资本实验室随着全球城市化进程的加速,越来越多的人涌进城市,这为城市建设带来了一系列的挑战:一方面,城市需要面对大量的越来越老化的基础设施;另一方面,需要为新涌入的城市居民提供新的&a…

Android之ViewDragHelper

在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是一件很不容易的事,需要自己去处理:多手指的处理、加速度检测等等。 好…

DARPA人工智能技术研究情况一览

来源:一体化指挥调度国家工程实验室、高端装备发展研究中心摘要:20世纪60年代初,DARPA(当时为ARPA)开始介入自主技术研究,并很快成为该领域的主要研究机构。DARPA意识到,人工智能可以满足大量的…

深入“肠-脑”神经高速通道,揭开“第六感觉”面纱

来源:中国生物技术网直觉是什么?通常被描述为超感官的第六感觉,它在英文里直译就是肠道感觉。肠道作为“第二大脑”的事实已经家喻户晓了。如果你曾在重要的演讲前感到心慌恶心,或者在一顿大餐后感到头昏眼花,那就是肠…

Andoird自定义ViewGroup实现竖向引导界面

一般进入APP都有欢迎界面&#xff0c;基本都是水平滚动的&#xff0c;今天和大家分享一个垂直滚动的例子。 先来看看效果把&#xff1a; 首先是布局文件&#xff1a; <com.example.verticallinearlayout.VerticalLinearLayout xmlns:android"http://schemas.android.…

科技|全球首款飞行汽车开始量产!下月开始预售,2023年后或可实现一键打“飞车”...

来源&#xff1a; 世界科技创新论坛飞机与汽车结合的产物真的要来了。在2018全球未来出行大会上&#xff0c;吉利副总裁杨学良透露&#xff0c;由吉利控股的全资子公司、全球首家飞行汽车公司美国太力飞行汽车公司推出的“全球首款量产飞行汽车”——Transition&#xff0c;将于…

Android手势锁实现

最终效果如下 整体思路 a、自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数&#xff0c;生成多个GestureLockView&#xff08;就是上面一个个小圈圈&#xff09;&#xff0c;然后会自动进行布局&#xff0c;里面的宽度&#xff0c;间距&#x…

智能连接:5G与人工智能、物联网等技术的超级融合

来源&#xff1a;资本实验室随着新技术的成熟&#xff0c;新型的、先进的应用将来自5G、人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;的融合。这种融合将创造出一个智能连接的世界&#xff0c;对所有个人、行业、社会和经济产生积极影响。从现在到2…

一个绚丽的loading动效分析与实现!

最终效果如下 从效果上看&#xff0c;我们需要考虑以下几个问题&#xff1a; 1.叶子的随机产生&#xff1b; 2.叶子随着一条正余弦曲线移动&#xff1b; 3.叶子在移动的时候旋转&#xff0c;旋转方向随机&#xff0c;正时针或逆时针&#xff1b; 4.叶子遇到进度条&#xff…

20岁的谷歌,和它“最成功”的大败笔

来源&#xff1a;大数据文摘编译&#xff1a;张驰、JIN、涂世文、钱天培谷歌20岁了&#xff01;20年中&#xff0c;谷歌打造了无数或成功或流产的产品&#xff0c;其中&#xff0c;这一名为“谷歌光纤”计划的失败或许是它最“成功”的“大败笔”。2010年&#xff0c;谷歌宣布了…

自定义viewgroup实现ArcMenu

最终效果如下 实现思路 通过效果图&#xff0c;会有几个问题&#xff1a; a、动画效果如何实现 可以看出动画是从顶点外外发射的&#xff0c;可能有人说&#xff0c;那还不简单&#xff0c;默认元素都在定点位置&#xff0c;然后TraslateAnimation就好了&#xff1b;这样忽略…

也谈谈Atiyah关于黎曼猜想的证明

来源&#xff1a;潇轩社作者&#xff1a;叶扬波 著名数学家&#xff0c;美国爱荷华大学教授。作为数论学家&#xff0c;他在中国大陆出版有《迹公式与模形式》等专著。以下是他谈Atiyah关于黎曼猜想的证明的文章&#xff0c;观点专业而且独到&#xff0c;转载此文&#xff0c;…

大型Javascript应用架构的模式(译文)

附上翻译好的word文件 http://files.cnblogs.com/lizhug/Patterns_For_Large-Scale_JavaScript_Application_Architecture.zip 作者&#xff1a;Addy Osmani 技术评审&#xff1a;Andree Hansson 翻译&#xff1a;李珠刚 珠刚参上 今天我们将要探讨一系列用于大型Javascri…

Animation Property Animation 使用

本篇主要讲Animation 和 Property Animation的使用&#xff0c;最后会讲QQ管家桌面火箭作为例子&#xff1a; 在Android中开发动效有两套框架可以使用&#xff0c;分别为 Animation 和 Property Animation&#xff1b; 相对来说&#xff0c;Animator比Animation要强大太多&…