栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【数据结构】C语言算法练习题——利用“快慢指针”去判断一个链表中是否带环

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据结构】C语言算法练习题——利用“快慢指针”去判断一个链表中是否带环

题目链接:

力扣https://leetcode.cn/problems/linked-list-cycle/submissions/

解题思路:

1. 带环链表不能遍历,否则会造成死循环

2. 定义俩个快慢指针,慢指针每次向后走一步,快指针每次向后走俩步。即快慢指针相差一步。

所以如果一个链表中存在环结构,

则快指针一定比慢指针先进入环结构,随着快指针进入环内运动循环,慢指针最终也会进入环内。

因为快慢指针均进入了一个环结构,所以不会遇到 NULL 指针,一直在循环。

这会使快慢指针最终会相遇,即指向的地址相同

而如果这个 单链表中 不存在环结构,则快指针最终会遇到 NULL 指针结束循环

这实际上是根据带环链表的结构特点去解题

3. 不带环结构的单链表需要考虑其结点的个数是奇数个还是偶数个

4. 【思考】:为什么快慢指针在环结构内最终一定会相遇?

为什么快指针每次走两步,慢指针走一步可以?
 

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。

当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。

此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,

因此:在满指针走到一圈之前,

快指针肯定是可以追上慢指针的,即相遇

快指针一次走3步,走4步,...n步行吗?

不行

参考代码:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode *fast , *slow;
    slow = head;
    fast = head;
    while (fast && fast->next)//不带环结构的单链表的结点个数分奇数个和偶数个;
                              //存在偶数个结点时是 fast 走到 NULL
                              //存在奇数个结点时是 fast->next 走到 NULL
    {
        slow = slow->next;
        fast = fast->next->next;//比慢指针多走一步,每次向后行走俩步
        if (slow == fast)
        {
            return true;
        }

    }

    return false;
    
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883377.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号