C语言每日一题:13《数据结构》环形链表。

请添加图片描述

题目链接:

一.环形链表运动基础。

使用快慢指针利用相对移动的思想:

1.第一种情况:

1,令快指针(fast)速度为2.
2.慢指针(slow)速度为1.
3.以慢指针进入环中开始。
4。假设slow刚刚进入环中fast与它相距N。

如图所示:
请添加图片描述

2.第二种情况:

1,令快指针(fast)速度为3.M
2.慢指针(slow)速度为1.
3.以慢指针进入环中开始。
4。假设slow刚刚进入环中fast与它相距M。

如图所示:
请添加图片描述
请添加图片描述
请添加图片描述

3.总结:

我们的距离改变是依靠相对速度而产生的相对距离。当相对速度为1的时候我们只要存在环就一定可以相遇。但是当相对速度为二的时候就相遇考虑之间的距离差值是奇数还是偶数所以判断链表带环的指针速度比较好的是:快指针(fast)速度为2.慢指针(slow)速度为1.

二.带环链表的进入环的节点。

假设:
1.链表无环部分长度:L
2.圆的周长为C
3.慢指针刚刚进入链表是快慢指针的距离为X

1.第一种情况。

1.当我们的环比较大的情况:

如图所示:
请添加图片描述

2.第二种情况。

2.当我们的环比较小的时候:

如图所示:
请添加图片描述
总结:环比较短的推导公式是可以通过n的变化适用于各种情况的。

3.两个思路

思路一:

1.依据我们L=(n-1)C+(C-X)作为理论依据。
2.重新定义两个节点一个从交点开始走每次走一步。
3.一个从头链表头开始走两个节点一定会相遇并且相遇的点就是进入点。

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow=head,*fast=head;//考虑带环还是不带环。while(fast&&fast->next){//进行移动:slow=slow->next;fast=fast->next->next;if(slow==fast){struct ListNode* meet=fast;while(head!=meet){head=head->next;meet=meet->next;} return meet;}}return NULL;}

思路二:

1.假设我们没有理论依据。
2.找到节点之后可以转化成相交链表的问题。
3.找到节点之后把相遇节点的下一个置位空。
4.这样就分开了两个链表链表的位节点就是相遇点。
5.求两个链表的长度进行差距长的先走差距步。
6。一起走相等就是交点。

 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA,*curB=headB;struct ListNode* tileA=headA,*tileB=headB;int lenA=1,lenB=1;while(tileA->next){tileA=tileA->next;lenA++;}while(tileB->next){tileB=tileB->next;lenB++;}if(tileA!=tileB){//说明没有相交return NULL;}//说明一定相交int gap=abs(lenA-lenB);//2.谁比较大就先走差距步//假设struct ListNode* shortlist=headA,*longlist=headB;if(lenB<lenA){//修正shortlist=headB;longlist=headA;}//长的先走差距补。while(gap--){longlist=longlist->next;}while(shortlist&&longlist){if(shortlist==longlist){return longlist;}else{shortlist=shortlist->next;longlist=longlist->next;}}return NULL;
}
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow=head,*fast=head;//考虑带环还是不带环。while(fast&&fast->next){//进行移动:slow=slow->next;fast=fast->next->next;if(slow==fast){struct ListNode* meet=slow;struct ListNode* new=meet->next;meet->next=NULL;return getIntersectionNode(head,new); }}return NULL;}

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

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

相关文章

【夜深人静学习数据结构与算法 | 第十二篇】动态规划——背包问题

目录 前言&#xff1a; 01背包问题&#xff1a; 二维数组思路&#xff1a; 一维数组思路&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前面我们学习动态规划理论知识的时候&#xff0c;我就讲过要介绍一下背包问题&#xff0c;那么今天我们就来讲解一下背包问题。 在这…

NetApp 入门级全闪存系统 AFF A250:小巧而强大

NetApp 入门级全闪存系统 AFF A250&#xff1a;小巧而强大 作为 AFF A 系列中的入门级全闪存系统&#xff0c;AFF A250 不但可以简化数据管理&#xff0c;还能为您的所有工作负载提供令人惊叹的强劲动力&#xff0c;价格也平易近人。 AFF A250&#xff1a;您的新 IT 专家 AFF…

工厂方法模式(Factory Method)

工厂方法模式就是定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法模式将类的实例化&#xff08;具体产品的创建&#xff09;延迟到工厂类的子类&#xff08;具体工厂&#xff09;中完成&#xff0c;即由子工厂类来决定该实例化哪一个类。 Define a…

Knife4j系列--解决不显示文件上传的问题

原文网址&#xff1a;Knife4j系列--解决不显示文件上传的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍使用Knife4j时无法上传文件的问题。 问题复现 依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-…

为什么马斯克和奥特曼都想重振加密货币?

1、前言 加密货币已经死了吗&#xff1f;这个问题的答案取决于谁来回答。一个加密爱好者会给你一百个不同的理由来解释为什么加密货币没有死。特斯拉CEO埃隆马斯克和OpenAI CEO 山姆奥特曼都对加密货币及其在塑造未来世界中的潜在作用有着浓厚的兴趣。 在过去很长一段时间里&…

国内GitHub加速访问工具-Fetch GitHub Hosts

一、工具介绍 Fetch GitHub Hosts是一款开源跨平台的国内GitHub加速访问工具&#xff0c;主要为解决研究及学习人员访问 Github 过慢或其他问题而提供的 Github Hosts 同步工具。 项目原理&#xff1a;是通过部署此项目本身的服务器来获取 github.com 的 hosts&#xff0c;而…

Stability AI旗舰图像模型 SDXL1.0发布,AI绘画进入新的时代

Stability AI于7月26号开源了SDXL1.0文生图模型&#xff0c;要知道距离SDXL0.9开源发布也不过一个月,只能说AI发展日新月异。 根据官网介绍&#xff0c;SDXL1.0经过迭代更新&#xff0c;已经是目前世界上最好的图像生成模型 官网根据Discord上的几代实验模型和外部测试&#…

【力扣刷题 | 第二十四天】

目录 前言&#xff1a; 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 总结 前言&#xff1a; 今晚我们爆刷动态规划类型的题目。 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这…

广州银行信用卡中心:强化数字引擎安全,实现业务稳步增长

广州银行信用卡中心是全国城商行中仅有的两家信用卡专营机构之一&#xff0c;拥有从金融产品研发至销售及后期风险控制、客户服务完整业务链条&#xff0c;曾获“2016年度最佳创新信用卡银行”。 数字引擎驱动业务增长 安全左移降低开发风险 近年来&#xff0c;广州银行信用卡…

day20-101. 对称二叉树

101. 对称二叉树 力扣题目链接 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 思路 镜像对称必要的条件就是根节点的左右子树互相对称 左子树的左孩子 右子树的右孩子左子树的右孩子 右子树的左孩子 递归 使用递归前要确定递归的顺序&#xff0c;是前序、后序还…

【Android】在AndroidStudio开发工具运行Java程序

在Android Studio开发工具中&#xff0c;Android系统开始就是用java语言开发的&#xff0c;还可以java代码来写程序&#xff0c;控制台&#xff0c;桌面应用&#xff0c;还可以写可调用的模块&#xff0c;这里讲一下创建Java程序步骤&#xff0c;方便入门java语言开发。 新建一…

Leetcode-每日一题【剑指 Offer 39. 数组中出现次数超过一半的数字】

题目 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2 限制&#xff1a; 1 < 数组长度 < 50000 解题思路 前置知…

Docker Compose编排部署LNMP服务

目录 安装docker-ce 阿里云镜像加速器 文件 启动 安装docker-ce [rootlocalhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo --2023-08-03 18:34:32-- http://mirrors.aliyun.com/repo/Centos-7.repo 正在解析主机 m…

观察者模式(Observer)

观察着模式是一种行为设计模式&#xff0c;可以用来定义对象间的一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式、模型-视图&#xf…

新手指南:流程图中各种图形的含义及用法解析

我们经常在技术设计、沟通、业务演示等一些领域看到流程图&#xff0c;它也可以称为输入输出图。顾名思义&#xff0c;它是指一种简单的工作流程的具体步骤&#xff0c;比如包括一次会议的流程&#xff0c;以及一次生产制造的顺序和过程等。本文将为大家介绍流程图的含义和具体…

【零基础学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

文章目录 简介&#xff1a;一&#xff0c;变量1&#xff0c;变量的定义2&#xff0c;变量的可变性3&#xff0c;变量的隐藏 二、数据类型1&#xff0c;标量类型2&#xff0c;复合类型 三&#xff0c;运算符1&#xff0c;算术运算符2&#xff0c;比较运算符3&#xff0c;逻辑运算…

在windows配置redis的一些错误及解决方案

目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口&#xff0c;是可以正常连接的&#xff0c;但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…

【JAVA】正则表达式是啥?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言正则表达式正则表达式语法正则表达式的特点捕获组实例 前言 如果我们想要判断给定的字符串是否符合正则表达式的过滤逻辑&#xff08;称作“匹配”&#xff09;&#xff0c…

Screens 4 for mac VNC客户端 强大的远程控制工具

Screens 4 for Mac 是一款功能强大的 VNC 客户端软件&#xff0c;为 Mac 用户提供了便捷的远程访问和控制解决方案。无论您是需要远程管理服务器、办公电脑&#xff0c;还是需要远程协助他人解决问题&#xff0c;Screens 4 都是您的理想选择。 Screens 4 for Mac具备简洁直观的…

Mybatis 实体类属性名和表中字段名不一致怎么处理

一. 前言 最近耀哥有学生出去面试&#xff0c;被问到 “Mybatis实体类的属性名和表中的字段名不一致该怎么处理&#xff1f;”&#xff0c;这其实是一个很经典的面试题&#xff0c;接下来耀哥就为大家详细解析一下这道面试题。 二. 分析 2.1 实体类和字段名不一致所带来的后果…