首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言编程实战:每日一题:环形链表

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

作者头像
say-fall
发布2026-01-15 15:06:26
发布2026-01-15 15:06:26
10
举报
欢迎来到say-fall的文章
在这里插入图片描述
在这里插入图片描述

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



题目:环形链表

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

思路解析

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

  1. 算法核心思想
    • 使用两个指针,slow(慢指针/乌龟)和fast(快指针/兔子),同时从链表头部出发。
    • slow指针每次移动一步fast指针每次移动两步
    • 如果链表中存在环,那么快指针最终一定会追上慢指针(两者指向同一个节点);如果不存在环,快指针会先到达链表尾部(指向NULL)。
  2. 逻辑拆解
    • 初始化:两个指针都指向链表头节点head
    • 循环条件fast != NULL && fast->next != NULL,确保快指针不会访问空指针的成员,避免程序崩溃。
    • 指针移动:慢指针走一步,快指针走两步。
    • 环检测:如果快慢指针相遇(slow == fast),说明链表有环,返回true;否则循环结束后返回false

流程图

代码

代码语言:javascript
复制
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),仅使用了两个指针的额外空间,是原地算法。

  • 本节完…
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目:环形链表
    • 思路解析
    • 流程图
    • 代码
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档