C语言编程实战:每日一题:环形链表

欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到sayfall的文章

在这里插入图片描述


🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言
🔥专栏: 《C语言从零开始到精通》 《C语言编程实战》 《数据结构与算法》 《小游戏与项目》
💪格言:做好你自己,你才能吸引更多人,并与他们共赢,这才是你最好的成长方式。



题目:环形链表

思路解析

经典的Floyd判圈算法(龟兔赛跑算法),用于检测单链表中是否存在环。

  1. 算法核心思想

    • 使用两个指针,slow(慢指针/乌龟)和fast(快指针/兔子),同时从链表头部出发。
    • slow指针每次移动一步fast指针每次移动两步
    • 如果链表中存在环,那么快指针最终一定会追上慢指针(两者指向同一个节点);如果不存在环,快指针会先到达链表尾部(指向NULL)。
  2. 逻辑拆解

    • 初始化:两个指针都指向链表头节点head
    • 循环条件fast != NULL && fast->next != NULL,确保快指针不会访问空指针的成员,避免程序崩溃。
    • 指针移动:慢指针走一步,快指针走两步。
    • 环检测:如果快慢指针相遇(slow == fast),说明链表有环,返回true;否则循环结束后返回false

流程图

开始
初始化: slow=head, fast=head
fast != NULL 且 fast->next != NULL?
返回false
slow = slow->next
fast = fast->next->next
slow == fast?
返回true
结束

代码

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

总结

  • 核心算法:Floyd判圈算法(龟兔赛跑),通过快慢指针的追击问题检测链表环。
  • 时间复杂度:O(n),每个节点最多被访问两次(慢指针遍历一次,快指针最多遍历两次)。
  • 空间复杂度:O(1),仅使用了两个指针的额外空间,是原地算法。

  • 本节完…
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值