带环链表问题及问题解决的底层原理剖析(上)

文章深入探讨了快慢指针解决链表环检测问题的底层逻辑,以及速度差对判断的影响,指出速度差为1或2时可确定环,而大速度差虽仍可判断,但条件不同。
摘要由CSDN通过智能技术生成

题1

题目链接:判断链表是否带环
解:
该题的解题思路是用快慢指针,快指针每走两步,慢指针走一步。若链表不存在环,那么快指针走到NULL
就可以判断链表不存在环。若链表存在环,那么快指针和慢指针最终会在环内相遇,即slow==fast。
详细过程如下:

bool hasCycle(struct ListNode *head) {
   /特殊情形:
    if(head==NULL||head->next==NULL)
    {
        return false;
    }

   /一般情形:
    struct ListNode*slow=head,*fast=head;
    while(fast!=NULL) /若链表不存在环,即fast走到NULL时循环结束
    {
       /快指针走两步:
       fast=fast->next;
       if(fast!=NULL)  /防止当fast为空时对其解引用,因此快指针走两步可以分步走
       {
        fast=fast->next;
       }
       
       /慢指针走一步:
       slow=slow->next;
       
       if(slow==fast)/链表存在环的判断条件
       {
        return true;
       }
    }
    if(fast==NULL) /当链表不存在环时
    {
        return false;
    }
    return true;
}
本文重点要探讨的不是该问题如何解决,而是研究解决该问题的方法的底层逻辑,即快慢指针为甚么能解决该问题,并且如果快指针一次走三步会怎样,一次走四步又会怎样,慢指针一次走两步、三步又会怎样…
下面基于fast指针一次走两步,slow指针一次走一步来对问题进行探讨:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

然而,当fast一次走3步、4步呢?当slow一次走2步,3步呢?可以发现,影响fast和slow之间的间距的因素不是它们各自一次走几步,而是它们的速读差。下面以fast一次走3步,slow一次走1步(速度差为2)来进行探讨:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进一步拓展:当fast与slow的速读差为3时:

在这里插入图片描述

总结:对于判断链表是否存在环问题,用到快慢指针,而快慢指针的速度差为1或者2都是可以判断链表是否存在环的,而速度差为3或者4,5…虽然也是可以判断,但存在条件。

完结!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值