IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Floyd环检测算法的小小心得! -> 正文阅读

[数据结构与算法]Floyd环检测算法的小小心得!

一、简述floyd环检测算法:(我将其分为2部分)

1.检测是否有环:2指针龟和兔,兔的速度是龟的2倍,同时出发,两者将相遇与环中某点。代码如下:

ListNode* slow = head;
ListNode* fast = head->next;
//这里起点不同
        
while (slow != fast)
{
    if (!fast || !fast->next)
        return false;
    slow = slow->next;
    fast = fast->next->next;
}

return true;

2.找环的入口:将其中一指针置回起点,另一指针在之前相遇之处不动。此时同时以相同速度向前进,两者将相遇与环的入口。代码如下:

fast = fast->next;//
slow = head;

while (slow != fast)
{
    slow = slow->next;
    fast = fast->next;
}
    
return slow;

二、在做LeetCode?142. 环形链表 II这道题时,发现自己写的和题解不一样嗷。觉得很奇怪。

题解:(来源:https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/

fast = head;

while (slow != fast) {
    slow = slow.next;
    fast = fast.next;
}

return fast;
  • 为什么它可以作一个动作(即置回原点)即可,我需要再让fast指针再往前走一步才能得到正确的答案呢?

一行行比对才发现异同点:题解作者的fast和slow是在同一起点head出发的,而我写的slow指针在head,fast指针在head头结点的下一个结点。因此第一部分代码也有所不同,即以while(1)为循环条件,遇到slow == fast再break出来。

  • 那如果在检测是否有环部分,两指针起点不一样,应该怎样理解和确定第二部分(即找环入口部分)的两个指针的起点呢?

?其实slow在head、fast在head的下一个结点这种赋值方法,可以看成是:两指针原在头结点的前一个结点同时出发,只是各自先走了一步。这样就和题解做法相同了。

而第二部分代码中,“将其中一个指针置回起点”中的起点,指的应该是第一部分中两个指针以相同地方开始的起点。若第一部分代码中两指针起点不同,第二部分代码slow重新置为head,(为方便叙述,将头结点的前一个结点称为pre)由于slow在head即pre->next,slow已经前进了一步,为保持同步以便得到正确答案,fast也应该前进一步,故有fast = fast -> next这一动作。若slow以pre为起点,fast可以不动。(但pre其实并不存在)


这样也就可以解释这道题287. 寻找重复数为什么在第二部分以动作slow = 0为开头。

第一部分fast =?nums[nums[0]],slow?=?nums[0],即以数组第一个元素的前一个元素为起点(实际并不存在这个元素)。由于题目条件已限定数组中所有元素值的范围为[1,n-1],0不会是任一元素,函数以值为映射,故起点为slow = 0。


若有误,欢迎交流与指正。

(我滴小小心得!每天进步一点点妈妈夸我小天才~)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:37:13  更:2021-08-29 09:39:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/25 8:16:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码