【数据结构算法经典题目刨析(c语言)】判断链表是否有环(图文详解)

💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:数据结构经典题目刨析(c语言)

目录

 一、题目描述

二、解题思路 

三、代码实现 


 

 一、题目描述

二、解题思路 

通过快慢指针可以实现判断——慢指针每次走一步,快指针每次走两步
假设存在环的话,快指针会先进环,此时慢指针在环外走了一半;
继续走,当慢指针进环时,快指针已经在环中走了一段时间;
此时快慢指针的相对位置未知,但也无须得知。
因为此时快慢指针都在环中,而快慢指针每移动一次,两者之间的距离都减小一步,当快慢指针相遇,就可以证明链表是带环的
如果快指针先走向了NULL,则说明链表不带环
这种方法的关键在于,如果存在环,那么快指针最终会追上慢指针。

.快慢指针的移动分三个阶段:(详细图解)

(假设链表存在环的情况)

三、代码实现 

只需要定义两个快慢指针
while循环遍历,快指针每次走两步,慢指针每次走一步

如果快慢指针指向节点相同,则说明链表带环
如果快指针走到NULL,说明链表不带环

struct ListNode {
      int val;
      struct ListNode *next;
  };
 
bool hasCycle(struct ListNode *head) 
{
    struct ListNode*slow,*fast;
    slow=fast=head;
    while(fast&&fast->next)//也判断了链表尾空和只有一个节点的情况并防止了下面空指针解引用
    {
        slow=slow->next;//注意应该先移动再判断
        fast=fast->next->next;
        if(slow==fast)//否则就会因为初始位置相同返回true
        {
            return true;
        }
    }
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值