首页 > 编程语言 >Floyd 判圈算法

Floyd 判圈算法

时间:2024-03-24 13:11:53浏览次数:21  
标签:ListNode 判圈 相遇 fast next 算法 Floyd 节点 指针

概述

  Floyd判圈算法又称作是龟兔赛跑算法,就是快慢指针的应用,主要用于判断并找到环形链表的入口。做法是设置两个指针,一个快指针(兔子),一个慢指针(乌龟),快指针一次移动两个节点,慢指针一次移动一个节点。如果有环存在,它们第一次会在环上相遇,这时快指针移动到出发点,转换成慢指针(就是以慢指针的速度移动),两指针再同时移动,每次移动一个节点,再次相遇时,会在环的入口处。

证明

  主要有两点需要证明:

  1. 兔子和乌龟在环内必然相遇。
  2. 兔子和乌龟再次相遇时,在环的入口处。

  对于第一点的证明很简单,如果环存在,当乌龟到环入口时,兔子已在环内某节点处,它们之间存在一定距离(包括相遇),又存在固定的速度差,这就是简单的相遇问题了(追及问题),所以必然会在环内某点相遇。

  对于第二点的证明,要分为两个要点:

  1. 兔子(速度和乌龟一样了)和乌龟会再次相遇
  2. 相遇点在入口处

  先证明第一点,假设第一次相遇时,兔子走的2n个节点,则乌龟走了n个节点。兔子从出发点再次回到相遇点时,走了n个节点,与上一次乌龟走的一样,这时乌龟又走了n个节点,一共走了2n个节点,与上一次相遇时兔子走的一样,这时则也必然回到相遇点,两者相当于身份转换了。

  对于第二点的证明,因为两者的速度一样了,所以在环内,相遇的话,上个节点也必然相遇,若不相遇,则都不会相遇,那么它们第二次只可能在环的入口处相遇,才能保证处处相遇。

实现

  通用代码如下:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

class Solution {

public:

    ListNode *detectCycle(ListNode *head) {

  

        if(head == NULL) {

            return NULL;

        }

  
		//分配空间并初始化
        ListNode* fhead = new ListNode(0);

        fhead->next = head;

		//将快慢指针初始在链表外,为下一个循环判断做准备
        ListNode* fast = fhead;

        ListNode* slow = fhead;

  
		//判断是否存在环
        do {
			//链表到头了,说明是单向链表
            if(fast->next == NULL || fast->next->next == NULL) {
				//释放内存,防止内存泄漏
                delete fhead;

                return NULL;

            }

  
			//快指针一次移动两个节点
            fast = fast->next->next;
			//慢指针一次移动一个节点
            slow = slow->next;

        } while(fast != slow);

  

        fast = fhead;

  
		//找到环的入口
        while(fast != slow) {

            fast = fast->next;

            slow = slow->next;

        }

  

        ListNode* result = fast;
		//释放内存,防止内存泄漏
        delete fhead;

  

        return result;

    }

};

例题

  这里有相关例题,可以练习练习:

  1. 141. 环形链表 - 力扣(LeetCode)
  2. 142. 环形链表 II - 力扣(LeetCode)
  3. 287. 寻找重复数 - 力扣(LeetCode)

标签:ListNode,判圈,相遇,fast,next,算法,Floyd,节点,指针
From: https://www.cnblogs.com/import-this05/p/18092298

相关文章

  • 蓝桥杯2017年第八届真题-分巧克力(二分算法)
    题目描述儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是HixWi的方格组成的长方形。为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:1.形状是正方形,边长是整数2.大......
  • TSP旅行商问题——SA模拟退火算法,SA+GA组合算法(代码解释)
    SA代码直接用就行,成功率极高importrandomimportnumpyasnpimportmatplotlib.pyplotasplt#randomlygeneratethemapwithconstraintof[-100,100]defgen_cities(city_num,random_state=True):ifrandom_state:cities=(np.random.uniform(0......
  • java数据结构与算法刷题-----LeetCode75. 颜色分类
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录1.双指针两次遍历2.三指针1.双指针两次遍历解题思路:时间复杂度O(......
  • java数据结构与算法刷题-----LeetCode451. 根据字符出现频率排序
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录1.hash统计出现次数后排序2.桶排序1.hash统计出现次数后排序解题思路:时间复杂度O(......
  • Myelsa的Python算法之旅(高铁直达)
    博客个人主页(非风V非雨):https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421Python-VBA编程500例算法清单(持续更新中)Myelsa的Python算法之旅创作清单算法明细对应网址博客个人主页(非风V非雨)非风V非雨-CSDN博客Myelsa的Python算法之旅(高铁直达)Myelsa的Python算法......
  • 算法 链表 206.反转链表
    文章目录一.题目二.代码三.总结一.题目题意:反转一个单链表。示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL二.代码publicclassReverseList{publicstaticvoidmain(String[]args){ListNode2head=newListNode2(1,newList......
  • 算法 链表 160.链表相交
    文章目录一.题目二.代码三.总结一.题目力扣160:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。二.代码publicclassLeetCode160{staticclassListNode{intval;L......
  • 洛谷题单算法1-6二分查找与二分答案
    代码仅供参考,不足之处望理解。P2249【深基13.例1】查找#include<iostream>usingnamespacestd;constintN=1e6+5;intn,m,a[N];intmain(){ios::sync_with_stdio(false);//输入cin>>n>>m;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1......
  • 基础算法--双指针练习总结
    Acwing部分练习:799.最长连续不重复子序列暴力未AC(53points):#include<iostream>usingnamespacestd;constintN=1e5+5;intn,a[N];boolcheck(intl,intr){for(inti=l;i<=r;i++){for(intj=i;j<=r;j++){if(i!=j&&a[i]==a[j]){......
  • Python 潮流周刊第 43 期(摘要),赠书 5 本《Python数据结构与算法分析(第3版)》
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2024-03-23-weekly特别提醒:本期赠书5......