判断是否有环以及求环的入口节点。

通过快慢指针来判断是否有环。慢指针为slow,快指针为fast。slow每次走一步,fast每次走两步,都从首节点开始。
摘要由CSDN通过智能技术生成

目录

思路一、

环形链表求环入口节点

一、判断是否有环

1.当节点个数为偶数个,slow走到中间节点,如果fast为空,则没有环。

2.当节点个数为奇数个,slow走到中间节点,如果fast->next为空,则没有环。

 3.如果有环,那么slow和fast一定会相遇。

4.延伸:如果fast每次走三步,四步,n步是否能相遇。

1. 如果fast走三步,那么差距步为n = 2。

2.如果fast走四步,差距步n = 3。

二、计算环入口节点

   

1. 首先通过判断是否有环,找到相遇节点。

思路二、

将环形链表求入口节点转换为两个相交链表求交点

步骤一:求出环内slow与fast相遇节点,当相遇时,相遇节点为fast或者slow

步骤二:创建指针newhead,记录相遇节点的下一个节点,将相遇节点的next置为NULL

 步骤三:创建指针curh,curnh,变量counth,countnh,计算两个链表节点个数

步骤四:head和newhead同时走,它们一定会相交

三、

思路一代码实现

思路二代码实现


思路一、

环形链表求环入口节点

一、判断是否有环

        通过快慢指针来判断是否有环。

        慢指针为slow,每次走一步。快指针为fast,每次走两步。都从首节点head开始。

1.当节点个数为偶数个,slow走到中间节点,如果fast为空,则没有环。

2.当节点个数为奇数个,slow走到中间节点,如果fast->next为空,则没有环。

 

 3.如果有环,那么slow和fast一定会相遇。

        因为每当slow和fast向前走时,距离都会缩进1。slow处在环入口时,与正在环中的fast相距N。

        

        在移动的过程中,N = N-1、(N-1)-1.......1,0,直到N=0,slow和fast相遇。

4.延伸:如果fast每次走三步,四步,n步是否能相遇。

       

       可知,当slow处在环入口节点时,fast在环中,此时相距N。

1. 如果fast走三步,那么差距步为n = 2。

        如果N为偶数,那么N能被n除尽,与环的奇偶性无关N = N - 2、(N-2) - 2 .......2、0,能相遇。

        如果N为奇数,N则不能被n除尽,N = N - 2 、(N-2) - 2........1、-1,第一次fast追击上slow时,相距为1。

        N不能除尽,则判断是否相遇条件由N,变为fast在环内第一次追上slow之间的距离能否被除尽。

        假设环的节点数为C,fast在环内第一次追上slow,则slow与fast相距为C-1,此时判断是否相遇的条件为C-1是奇是偶,如果C-1仍然为奇数,则C-1不能被差距步n=2除尽,无法相遇。如果C-1为偶,则能被n除尽,能相遇。

2.如果fast走四步,差距步n = 3。

        可知,当slow处在环入口节点时,fast在环中,此时相距N。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值