链表环的检测及其扩展

如何检测一个单向链表有没有环?


前两天别人问了我这样一个问题,一个很长很长很长得单向链表,怎么检测他是否有环,我想啊想啊想啊,想了半天没想出来,后来查了一下发现原来如此啊,好思路啊。


解法一:

申请两个指针,第一个指针以步长1第二个指针以步长2同时遍历链表,如果指针2遇到了链表的尾节点(即Next为NULL的节点),则链表无环,如果两个指针指向同一节点,则说明链表有环。


衍生问题一、 链表有环的情况下,环中的节点数是多少?


这个问题相对简单,让第二个指针指向相遇的节点,第一个指针从相遇的节点开始以步长1开始遍历链表,当两个指针再次相遇则第一个指针经过的路程即环中的节点数,记做cnc(cyclical node count)。


衍生问题二、 找出环的开始节点。

第一个指针指向头结点,第二个指针指向相遇的节点,同时都以步长1开始遍历链表,当他们再次相遇时,就是环开始节点。

证明如下:设环之前有n个节点,环中有m个节点,相遇点在在环中的位置为m1,指针二在相遇前绕环循环了x圈,则有 (n+m1)*2=m*x+m1 ,代换可得 n=m(x-1)+(m-m1) .

即在第二次遍历的时候指针二绕环循环了x-1圈时在环开始点他们刚好相遇,真是巧合的不得了。


解法二:

此题还有一个稍差一点的解法,将链表逆序,如果最后尾节点是头节点(有环的时候又会绕回来),则说明链表有环。


解法三:

这是我自己想出来的方法,不过明显不适用,或者说根本不对。

给链表的 每个节点添加一个检测位,初始化为0,在检测的时候遍历链表,遍历过的部分将检测位置1,遍历过程中如果某个节点的检测位为1,则说明节点在此处形成了一个环。

解法四:

同方法三一样是我最初一个想法,设想链表的每个节点有个id号,而且是按顺序排列的,后面每一个节点id号都更大,如此如此,如此这还是单向链表嘛,哈哈。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值