OJ:【图解思路+源码】环形链表(I) | 环形链表(II)【C语言】[ 数据结构 ]

题一:环形链表(I)

在这里插入图片描述

141. 环形链表 - 力扣(LeetCode)

思路(快慢指针)

slow 每次走一步
fast 每次走两步
关于快慢指针[数据结构初阶] | OJ | 【快慢指针】 | 【思路+源码】题:链表的中间结点、链表倒数第k个结点、回文结构

在这里插入图片描述
但是这里有一个很重要的问题,这个 “环”不同于现实生活中的跑道,它不是由连续的路程组成,而是由单个不可分的结点组成,所以,fast和slow一定会相遇吗?

  • 关键在于slow和fast是1和2的关系👇
  • 首先,fast肯定比slow先进入环(如果有的话),当slow也进入环,就开始了“追逐”,而fast每次都比slow多走一个,即速度差为1,所以每过一次fast和slow之间的差距就-1
    • 假设,fast与slow之间的差距是N,那么随着 “追逐”,就会有如下变化:
    • N-1 → N-2 → N-3 → …………→ 0(相遇)
      在这里插入图片描述

那么,slow每走1步,fast走3、4、5、……步行不行?

同上的思路,假设,fast与slow之间的差距是N,那么随着“追逐”,就会有如下变化: N-2→ N-4 → N-6 → …………→可能会减到0,也可能从一个正数减到一个负数

  1. 首先,如果是空链表肯定return NULL;
  2. 定义两个快慢指针
  3. while循环,在fast和slow都不走到空的情况下,看fast和slow能不能相遇,如果相遇返回真
  4. 如果fast和slow跳出循环,即其中有一个走到了NULL,则返回假

源码

bool hasCycle(struct ListNode *head) 
{
    if(!head)
        return false;
        
    struct ListNode *slow=head,*fast=head;
    
    while(slow&&fast)
    {
        if(fast->next)
        {
            fast=fast->next->next; 
            slow=slow->next;
            if(slow==fast)
                return true;
        }
        else
            return false;
          
    }
    return false;
}

题二:环形链表(II)(找入环点)

在这里插入图片描述
题目链接:142. 环形链表 II - 力扣(LeetCode)

思路

思路一:承接上题

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

  • slow 每次走一步;fast 每次走两步
  • 因此,fast的路程一定是slow的两倍,但是,这里还有一个要考虑的事情fast可能在环里走了很多圈之后slow才进环(slow肯定没走完一圈,根据上面关于“追逐”部分的分析可知)
    在这里插入图片描述
  1. 首先我们得找判断是不是有环,如果有我们得找到meet,思路参考题一
  2. 利用如上结论找到入环点
struct ListNode *detectCycle(struct ListNode *head) {
    if(!head)
        return NULL;
    struct ListNode *slow=head,*fast=head;
    struct ListNode *meet=head;
    struct ListNode *cur=head;

    while(slow&&fast)
    {
        if(fast->next)
        {
            fast=fast->next->next; 
            slow=slow->next;
            if(slow==fast)
            {
                meet=slow;   
                while(meet!=cur)
                {
                    cur=cur->next;
                    meet=meet->next;
                }
                return meet;
            }
        }
        else
            return NULL;
          
    }
    return NULL;
}

思路二:把环从 meet断开(但是还是的找到 meet 哈)

在这里插入图片描述

关于相交链表👉OJ:【图解思路+源码】相交链表 |【C语言】[ 数据结构 ]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畋坪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值