环形链表详解

目录

1:什么是环形链表

2:环形链表的实现原理

3:分析

1):fast 和 slow 是否一定会在链表中相遇(fast 是否会和 slow 错过)

2):slow(fast)一次走1步,和slow(fast) 一次走2步,3步,4步.......n步的区别

4:总结

5:证明fast是否真的永远追不上slow


1:什么是环形链表

1):环形链表是单链表的一种变种,它允许节点之间的链接形成一个闭合的环。 这意味着链表的尾部可以指向头部,形成一个闭环。 这种结构使得某些操作,如遍历链表,变得复杂,因为需要特别处理环的起始和结束点。 环形链表的优势在于它节省了空间,因为它不需要像常规链表一样保留额外的指针空间。

2:环形链表的实现原理

1):我们在解决环形链表的问题时,我们一般要先判断这个链表是否带环,大多数时候我们一般是使用快慢指针来解决,那么我们该如何是实现呢?

一:第一步我们先定义两个指针,分别是快指针和慢指针,慢指针(slow)每次让他走1步,快指针(fast)每次让他走2步(也就是慢指针的2倍);

二:第二部我们创建一个while循环,这里的判断条件是fast 和 fast->next 都不为NULL;然后我们就可以让慢指针(slow)和快指针(fast)同时向后走,如果fast 和 fast->next 为NULL 了就退出循环;

三:第三步我们在循环中判断fast 是否等于 slow ,这一步判断他们是否相等也就间接的判断是否带环;

完整代码如下:

bool hasCycle(struct ListNode *head) {
     struct ListNode* fast = head, *slow = head;

     while(fast && fast->next)
     {
        slow = slow->next;
        fast = fast->next->next;

      if(fast == slow)
       {
           return true;
       }
     }
     
     return false;

}

3:分析

这里有两个问题可以很好的帮助我们分析和理解这个问题,分别是一:fast 和 slow 是否一定会在链表中相遇,有没有可能在fast 和 slow 的追击过程中会错过(不相遇)并别永远追不上;二:我们这里的slow一次走的是1步,那如果slow 一次走2步,3步,4步.......n步,接下来我们就这两个问题展开分析

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值