带环链表问题

news2024/11/24 1:15:53

带环链表就是字面意思带环的链表,例如以下这三种情况

 练习题

1.给定一个链表,判断链表中是否带环. - 力扣(LeetCode)

思路:快慢指针,慢指针走一步,快指针走两步,两个指针从链表的起始位置开始走,如果链表带环,快慢指针一定会在环中相遇,否则快指针先走到链表的末尾。

 

 

 当slow指针进环时,fast和slow追及(一定能追上),证明过程如下

 证明:假设slow进环时,与fast指针相距N,快慢指针的速度差为1,所以快慢指针之间的距离变化为

N->N-1->N-2->N-3->........->2->1->0,每追击一次,距离减小1,当减小为0时,就是追上了,这里最差的情况就是两个指针之间的距离刚好就是环的长度。

 所以,在慢指针走一圈之前,快指针肯定是可以追上慢指针的

问题扩展:

1.快指针走一次走3步,4步,n步可以吗?

当快指针走3步时,两指针之间的距离变化为

偶数              奇数

N                   N

N-2                N-2

N-4                N-4

...                     ...

4                        3

2                         1

0(追上了)            -1(错过了进行新一轮的追击),快慢指针之间的距离变为C-1(C为环的长度),这里又有两种情况,C-1分为奇数和偶数

总结:

1.N是偶数,第一轮就追上了

2.N是奇数,第一轮就会错过,距离变为C-1

   a.如果c-1是偶数,下一轮就追上

   b.如果c-1是奇数,就永远也追不上了

所以,如果同时存在N是奇数和C是偶数,就永远追不上(实际上这种情况并不存在)

证明:假设slow进环时,fast和slow之间的距离为N,此时fast已在环里走了x圈,slow走的距离为L,fast走L+x*C+C-N,fast走的距离是slow的3倍

3*L=L+x*C+C-N

2*L=(x+1)*C-N,如果同时存在N是奇数和C是偶数,这个等式就不成立,C和N只能同时为奇数或者偶数

结论:一定能追上,N为偶数第一轮就追上,N为奇数第一轮追不上,但C-1为偶数第二轮就可以追上。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
    ListNode*slow=head;
    ListNode*fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
        return true;
    }
    return false;
}

2.给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。. - 力扣(LeetCode)

结论:相遇后,slow指针指针继续走,cur指针起始位置开始走,相遇的位置就是入环的第一个节点

证明:slow指针走过的距离L+N,fast走的为L+N+C*x,fast走过的距离是slow的2倍

2*(L+N)=L+N+C*x

L=C*x-N=(x-1)*C+(C-N)x>=1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
    ListNode*slow=head;
    ListNode*fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            ListNode*meet=slow;
            while(meet!=head)
            {
                head=head->next;
                meet=meet->next;
            }
            return meet;
        }
    }
    return NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硅片和SOI哪个研究方向更好?

知识星球(星球名:芯片制造与封测社区,星球号:63559049)里的学员问:我研一将要结束,即将进入课题组。我们课题组方向有硅片和soi两种方向,这两种方向该如何选择呢? 硅片与…

python离线安装包的方法

python离线安装包的方法 访问对应安装包的镜像文件的网站找到适合自己的whl文件安装 访问对应安装包的镜像文件的网站 https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/<包名>/找到适合自己的whl文件 安装 下载完成后&#xff0c;进入opencv_python-3.4.11.45-c…

这是一个简单网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>爱德照明网站首页</title> <style> /*外部样式*/ charset "utf-8"…

标准降水指数(SPI)、标准化降水蒸发蒸腾指数(SPEI)和帕尔默干旱指数(PDSI)的下载、读取和可视化

数据下载网址&#xff1a;WWDT Data (dri.edu)https://wrcc.dri.edu/wwdt/data/PRISM/ 以SPI为例说明&#xff0c; 标准化降水指数(Standardized Precipitation Index, SPI)是由Mckee et al(.1993)分析美国科罗拉多干旱时,发现降水服从偏态分布,基于此提出了标准化降水指数。…

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

gitlab设置保护分支

gitlab设置保护分支方法 进入代码仓库首页&#xff0c;找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮&#xff0c;并点击展开 可以看到已经存在默认的保护分支&#xff0c;通常是master/main分支&#xff0c;也可以添加新的保护分支 新建保护分…

使用idm下载百度云被限速 idm下载大文件后要整合 idm下载百度网盘有限制最新解决办法教程 idm限速解除方法

Internet Download Manager简称IDM,是一款Windows系统专业下载加速工具,IDM下载器支持多种类型文件下载,并能完美恢复各种中断的下载任务,是一款Windows平台下的多线程下载器&#xff0c;支持浏览器自动嗅探功能下载资源文件&#xff0c;包括视频、音频以及图片等类型文件&…

BUUCTF:Web 解析(一)

一、[极客大挑战 2019] EasySQL 点击链接进入靶场 登录页面&#xff0c;查看页面源代码发现没留注释 先输入 admin or 11# 提交看看&#xff08;根据题意猜测考察的 SQL 注入&#xff09; 显示 Flag 二、[极客大挑战 2019] Havefun 打开靶场 页面只有一只猫&#xff0c;打开…

区块链 | IPFS:Merkle DAG(进阶版)

&#x1f98a;原文&#xff1a;Merkle DAGs: Structuring Data for the Distributed Web &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时&#xff0c;必须通过提供节点和边的具体表示来编码我们的数据…

jenkins 部署springboot 项目

文章目录 持续集成指定tag发布 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 持续集成 为了让程序代码可以自动推送到测试环境基于Docker服务运行…

服务网关GateWay原理

文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…

C语言二叉树和堆

二叉树基础知识&#xff1a; 1.栈、队列和顺序表都是线性结构 但是二叉树不是&#xff0c;二叉树是多分支结构 2.任何一棵树都可以拆分为子树和根节点&#xff0c;许多二叉树的相关问题都是用分治的思想进行函数的递归进行解决。 例&#xff1a;前序&#xff0c;中序&#x…

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

【牛客网】排列计算

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 如果直接涂色来计算单点权重&#xff0c;2e5*2e5必然超时。 所以用差分进行优化。 3. 代码实现 #include<bits/stdc.h> using name…

漏洞扫描神器:Nessus 保姆级教程(附破解步骤)

一、介绍 Nessus是一款广泛使用的网络漏洞扫描工具&#xff0c;用于发现和评估计算机系统和网络中的安全漏洞。它是一款功能强大的商业工具&#xff0c;由Tenable Network Security开发和维护。 以下是Nessus的一些主要特点和功能&#xff1a; 1. 漏洞扫描&#xff1a;Nessu…

来一篇错题集(虽然简单吧)

一.Assembly via Remainders #include<bits/stdc.h> using namespace std; typedef long long ll; int a[2000]; int b[2000]; int main(){int t;cin>>t;while(t--){int n;cin>>n;for(int i1;i<n-1;i){cin>>b[i];}int x1000000000;//使用1000000000…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

uniapp实现点击事件跳转页面

首先定义一个点击事件 这里采用的vue3的写法&#xff0c;然后写上触发事件后要跳转的路径 function jump() {uni.switchTab({url:/pages/bangong/index})} 到这里就简单的实现uniapp的点击跳转页面了

类和对象【四】运算符重载

文章目录 运算符重载的概念运算符重载&#xff08;函数&#xff09;返回值类型&#xff1a;任意类型函数名&#xff1a;operator已有操作符 运算符重载&#xff08;函数&#xff09;的特点和注意点3个比较特殊的运算符重载赋值运算符&#xff08;&#xff09;重载返回值类型和返…

C++奇迹之旅:C++内存管理的机制(进阶篇)

文章目录 &#x1f4dd;new和delete操作自定义类型&#x1f320; operator new与operator delete函数&#x1f309;operator new与operator delete函数 &#x1f320;new和delete的实现原理&#x1f309;内置类型&#x1f309;自定义类型 &#x1f320;定位new表达式(placement…