数据结构 【带环单链表】

在单链表中可能会存在一种情况,某一结点在经过几次转移之后回到了自己本身,这种情况就称之为带环链表。对于带环链表,我们不能轻易对其进行遍历,遍历可能会导致产生死循环。

带环链表的逻辑图如下所示:(这里只展示一种简单情况)

如何判断一个链表带环是在面试过程中常见的问题,这里介绍一个利用快慢指针检测链表是否带环的方法。主要思路如下:

代码实现:

cpp 复制代码
bool hasCycle(struct ListNode *head) {
    struct ListNode* fast = head,*slow = head;
    while(fast && fast->next)//没有环fast或fast->next必为NULL
    {
        slow = slow->next;
        fast = fast->next->next;
        if(fast == slow)
            return true;
    }
    return false;
    
}

上述思路衍生出来的问题:

1、fast每次移动2步为什么能确保一定和slow相遇?

假设fast和slow都进入了环,且fast和slow之间的距离为N,fast每次移动2步,slow每次移动1 步。那么两个指针都移动一次之后的距离变为:N-1;每移动一次之后的距离就会缩小1步,只要链表的环存在,那么N-1开始递减变成N-2,N-3,......2,1,0. 距离变为0时fast和slow相遇。

2、fast每次移动2步以上能不能相遇?

假设fast和slow都进入了环,且fast和slow之间的距离为N,fast每次移动3步,slow每次移动1 步。那么在每次移动一次之后它们之间的相对距离就会每次减少2步。那么距离开始从N开始递减:N,N-2 , N-4 ...... N能不能递减到0取决于N本身,假设N为奇数那么距离就不可能递减成0,假设N为偶数,那么就可以递减成0。所以,fast和slow就有可能相遇,也有可能一直不能相遇。

3、slow每次走2步,fast走3步能不能相遇呢?

这种情况也是可以相遇的,我们只要保证fast和slow的相对移动位置保持在1步就可以。

相关推荐
云里雾里!20 分钟前
力扣350. 两个数组的交集 II
数据结构·算法·leetcode
ada7_1 小时前
LeetCode(python)39.组合总和
开发语言·数据结构·python·算法·leetcode·职场和发展
cpp_25011 小时前
P1957 口算练习题
数据结构·c++·算法·题解·洛谷
月明长歌1 小时前
【码道初阶】LeetCode283移动零:把数组当成三段区间,用双指针原地“分区+稳定”
数据结构·算法
无尽的罚坐人生2 小时前
hot 100 42. 接雨水
数据结构·算法·leetcode·动态规划··双指针
胖咕噜的稞达鸭2 小时前
算法日记:分治-快排(颜色分类,排序数组,数组中的第k个最大元素 面试题17.14.最小k个数)
数据结构·算法·排序算法
小龙报2 小时前
【算法通关指南:算法基础篇 】模拟算法专题:1. 铺地毯 2. 回文日期 3. 扫雷
c语言·数据结构·c++·算法·动态规划·知识图谱·visual studio
wen__xvn2 小时前
代码随想录算法训练营DAY6第三章 哈希表part01
数据结构·算法·散列表
漫随流水2 小时前
leetcode算法(239.滑动窗口最大值)
数据结构·算法·leetcode
橘颂TA2 小时前
【剑斩OFFER】算法的暴力美学——字母异位词分组
数据结构·算法·leetcode·力扣·哈希算法·散列表·结构与算法