博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)如何在链表中找回路
阅读量:5313 次
发布时间:2019-06-14

本文共 1033 字,大约阅读时间需要 3 分钟。

转自  
 
 

如果你曾经想过要参加面试,像我一样,你一定看过这个问题:如何判断链表中存在环路。(我不太清楚这个问题的应用在哪里,烦请各位读者能够提示一下。)

先简单说一下我之前看到的方法。

方法一:蛮力法。

方法二:在链表中增加一个域visited,初始化都为0,从链表的头部开始走,每走过一个链表就标记visited为1,如果要访问的下一个节点的visited域为1,那么证明链表中有环。

方法三:如果不能增加域,可以设置一个数组,将已经访问的链表节点依次放入到数组中,在访问下一个节点时,如果这个节点的地址已经在数组中,那么也能证明链表中有环。

进入正题之前,先简单说一下今天的面试。今天下午我参加面试的时候也被问到了这个问题,面试官是个南开的MM。似乎她也意识到诸如此类的问题已经在网上司空见惯,所以就试探性的问我是不是之前已经在网上看到了方法。我很老实,回答:嗯。我俩相视而笑。

然后,她又问我一个问题:如何找到一个链表的中间元素?我想了想,灵光一闪,说:设置两个指针p和q,p一次走一下,q一次走两下,这样当q走到链表的尾部的时候,p应该正好走到链表的中间(我当时很佩服我自己。。。)。那个MM笑了一下,表示赞同,接下来随口的一句话把我带入了漩涡:嗯,刚才那个判断链表是否有环的问题也可以用这个方法。顿时,我脸上呈现出迷茫的表情,好奇心驱使着我问道:真的?MM一看我竟然不知道这个方法,说:哦,原来你不知道啊!正好,你想想用你刚才说的方法解决一下链表有环的问题。同志们,好奇心害死猫啊!

然后我就囧了,折腾了半天,画了个链表,在上面试着画了一下,发现如果链表有环,有可能q会追上p,相当与长跑中的套圈。但是,有一个问题:p是不是一定会和q重合?

这个问题看起来有些复杂,我们现在来抽象一下,这个问题不是很难。

假设此时p点刚刚进入到链表中的环中,q在环中的某一个位置,如图所示。

设t时间后,p和q在环中的某一点相遇,初始时p和q相隔k个节点(0<=k<=n-1,其中n为环中的节点数;图中p和q相隔3个节点,而不是2个:因为假如q不动,p需要经过3步移动才可以和q重合),那么可得:

t(mod n) = k + 2t(mod n)

那么,对任意的正整数m,使得:t + mn  = k + 2t

那么显然此时 t = mn-k,m>=1。

靠!原来这么简单。。。

转载于:https://www.cnblogs.com/cquljw/p/3663861.html

你可能感兴趣的文章
tensorflow的graph和session
查看>>
JavaScript动画打开半透明提示层
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
查看oracle数据库的连接数以及用户
查看>>
【数据结构】栈结构操作示例
查看>>
三.野指针和free
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>