一、环形链表Ⅰ

1、题目描述

https://leetcode.cn/problems/linked-list-cycle

2、算法分析

思路:快慢指针 

根据上图所示的流程,我们可以推测出这样一个结论:若链表带环,快慢指针一定会相遇

那么,这个猜测是否正确呢?下面给出严格的证明——

证明1:在环形链表中,快慢指针为什么在环里一定会相遇?(慢指针每次走一步,快指针每次走两步)

以上面的图为例,假设slow刚入环,此时slow和fast之间的距离达到最大,最大值为N。接下来,slow前进一步,fast前进两步,此时两者距离变为N-1。同理,fast和slow再继续向后走,距离依次变为N-2,N-3……2,1,0 。当距离为0时,两指针相遇。

证明2:在环形链表中,慢指针每次走一步,但快指针每次走3/4/5/6……步,快慢指针在环里是否还会相遇?

假设慢指针每次走一步,快指针每次走三步。还是以刚才那副图为例,fast和slow之间的距离依次变为N-2,N-4,……如果N为偶数,那么最后距离变为4,2,0,快慢指针相遇。但是N为奇数的话,最后距离变为3,1,-1,距离变为-1时说明出现了套圈,也就是二者并没有相遇,此时二者之间的距离为C-1(假设环的周长为C)。那下一圈二者能否相遇呢?根据刚才的分析,当N为奇数的时候才会出现套圈的情况,若C-1为奇数,即C为偶数,一定不会相遇。若C-1为偶数,即C为奇数,下一圈一定会相遇。快指针走的总路程是慢指针的三倍,也就是3 * 慢指针 = 快指针。我们假设慢指针刚入环,快指针已经走了n圈,也就是慢指针当前走的总路程为L,快指针走的总路程为L+C-N+nC。带入公式得:3L = L + C - N + nC。化简得:2L = (n+1)C - N。等式左边的2L一定是偶数,根据数学知识可以知道:①偶数 - 偶数 = 偶数   ②奇数 - 奇数 = 偶数。所以我们得到下面的结论:C为奇数,N为奇数;C为偶数,N为偶数。但是我们先前又得到N为奇数,C为奇数一定会相遇;N为奇数,C为偶数一定不会相遇。所以C为偶数,N为奇数的情况不存在,既然不存在该情况,也就是说快指针一次走三步,最终也一定会相遇。同理,快指针每次走4、5、……步也是一样的道理。综上:快指针无论每次走多少步,快慢指针都可以在带环链表中相遇。但是在编写代码时会有额外程序步骤的引入,所以我们习惯上还是快指针走两步,慢指针走一步~

3、参考代码

/*** 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(slow == fast){//相遇return true;}}return false;
}

二、环形链表Ⅱ

1、题目描述

https://leetcode.cn/problems/linked-list-cycle-ii

2、算法分析 

思路:快慢指针

slow和fast相遇节点距离入环节点的距离为1,而头结点距离入环节点的距离也是1~

 

 slow和fast相遇节点距离入环节点的距离为0,而头结点距离入环节点的距离也是0~

 

 slow和fast相遇节点距离入环节点的距离为2,而头结点距离入环节点的距离也是2~ 

根据上面三个案例,我们可以作出猜想:快慢指针相遇点和头结点到入环起始节点的距离是相等的。下面给出严格的证明——

证明:为什么在带环链表中,快慢指针相遇点和头结点到入环第一个结点的距离相等?

快指针走的总路程是慢指针的两倍, 根据这句话,我们得到公式:2 * slow = fast。慢指针走过的总路程为L + X,快指针走过的总路程为L + X + nR。带入上述公式得:2(L + X) = L + X + nR。化简得:L + X = nR。即L = nR - X。变形一下得:L = (n-1)R + (R-X)。L是头结点到入环第一个结点的距离,R - X是相遇点到入环第一个结点的距离,(n-1)R是走过的完整的环的路程,对师资并没有影响,所以得到L = R - X,也就是快慢指针相遇点和头结点到入环第一个结点的距离相等。证明完毕~

3、参考代码

/*** 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(fast == slow){//找相遇点//相遇点和头结点到入环第一个节点的距离相等ListNode* pcur = head;while(pcur != slow){slow = slow->next;pcur = pcur->next;}//pcur == slowreturn pcur;}}return NULL;
}

三、链表分割

1、题目描述

2、算法分析 

思路:创建两个链表(小链表、大链表),遍历原链表,小的结点尾插到小链表中,大的节点尾插到大链表中,最后让大链表和小链表首尾相连。

3、参考代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition
{
public:ListNode* partition(ListNode* pHead, int x){//创建两个带头的空链表ListNode* lessHead, *lessTail;lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));ListNode* greaterHead, *greaterTail;greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));ListNode* pcur = pHead;while(pcur){if(pcur->val < x){lessTail->next = pcur;lessTail = lessTail->next;}else{greaterTail->next = pcur;greaterTail = greaterTail->next;}pcur = pcur->next;}//大链表尾结点的next指针置为NULL(避免死循环)greaterTail->next = NULL;//大小链表首尾相连lessTail->next = greaterHead->next;ListNode* ret = lessHead->next;free(lessHead);free(greaterHead);lessHead = greaterHead = NULL;return ret;}	
};

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

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

相关文章

智能制造,从工厂建模,工艺建模,柔性制造,精益制造,生产管控,库存,质量等多方面讲述智能制造的落地方案。

智能制造&#xff0c;从工厂建模&#xff0c;工艺建模&#xff0c;柔性制造&#xff0c;精益制造&#xff0c;生产管控&#xff0c;库存&#xff0c;质量等多方面讲述智能制造的落地方案。

Qt 分裂布局:QSplitter 使用指南

在 GUI 开发中&#xff0c;高效管理窗口空间是提升用户体验的关键。QSplitter 作为 Qt 的核心布局组件&#xff0c;让动态分割窗口变得简单直观。一、QSplitter 核心功能解析 QSplitter 是 Qt 提供的布局管理器&#xff0c;专用于创建可调节的分割区域&#xff1a; 支持水平/垂…

R语言与作物模型(DSSAT模型)技术应用

R语言在DSSAT模型的气候、土壤、管理措施等数据准备&#xff0c;自动化模拟和结果分析上都发挥着重要的作用。一&#xff1a;DSSAT模型的高级应用 1.作物模型的概念 2.DSSAT模型发展现状 3.DSSAT与R语言的安装 4.DSSAT模型的高级应用案例 5.R语言在作物模型参数优化中的应用 6.…

JavaSE:学习输入输出编写简单的程序

一、打印输出到屏幕 Java提供了三种核心输出方法&#xff0c;适合不同场景&#xff1a; System.out.println() 打印内容后 自动换行 System.out.println("Welcome"); System.out.println("to ISS"); // 输出&#xff1a; // Welcome // to ISSSystem.out…

访问者模式感悟

访问者模式 首先有两个东西: 一个是访问者vistor (每一个访问者类都代表了一类操作) 一个是被访问者entity (model /info/pojo/node等等这些都行)也就是是说是一个实体类 其操作方法被抽离给了其他类。 访问者模式的核心思想就是**“把操作从数据结构中分离出来,每种操作…

从零到部署:基于Go和Docker的全栈短链接服务实战(含源码)

摘要&#xff1a;本文将手把手带你使用Go语言&#xff0c;并遵循依赖倒置、分层架构等最佳实践&#xff0c;构建一个高性能、高可用的全栈短链接生成器。项目采用Echo框架、GORM、Redis、MySQL&#xff0c;并通过Docker和Docker Compose实现一键式容器化部署到阿里云服务器。文…

MyBatis_3

上一篇文章&#xff0c;我们学习了使用XML实现MyBatis进行增、删、查、改等操作&#xff0c;本篇文章&#xff0c;我们将学习#{ }和${ }获取方法参数的区别和使用MyBatisXML实现动态SQL语句。 #{ }和${ }的区别 在之前的文章中我们都是使用#{ }进行赋值&#xff0c;但实际上M…

智能图书馆管理系统开发实战系列(一):项目架构设计与技术选型

项目背景 智能图书馆管理系统&#xff08;ILMS&#xff09;是一个现代化的桌面应用程序&#xff0c;采用前后端分离架构&#xff0c;结合了Web技术的灵活性和桌面应用的用户体验。本项目从高保真原型设计开始&#xff0c;经过完整的软件开发生命周期&#xff0c;最终实现为一个…

应急前端“黄金3分钟”设计:极端场景下的操作界面极速搭建技术

摘要**地震突发&#xff0c;应急指挥系统的操作界面却因加载缓慢无法及时调取数据&#xff1b;火灾现场&#xff0c;消防员手持终端的操作步骤繁琐&#xff0c;延误救援时机。在分秒必争的极端场景中&#xff0c;传统前端操作界面为何频频 “掉链子”&#xff1f;怎样才能在 “…

【Android】三种弹窗 Fragment弹窗管理

三三要成为安卓糕手 零&#xff1a;布局转换 在很多工程当中用的都是LinearLayout和relativelayout&#xff0c;这两者都可以转化为Constrainlayout 注&#xff1a;这种用法并不能精确转换&#xff0c;具体还是要根据自己的需求来做布局约束一&#xff1a;snackbar显示弹窗 ((2…

【AI绘画】Stable Diffusion webUI 与 ComfyUI 全解析:安装、模型、插件及功能对比

一、Stable Diffusion 与 UI 工具概述 Stable Diffusion 是当前最主流的开源 AI 绘画模型&#xff0c;通过文本描述生成高质量图像。为降低使用门槛&#xff0c;开发者推出了多种图形界面&#xff08;UI&#xff09;工具&#xff0c;其中AUTOMATIC1111 webUI&#xff08;简称 …

ABP VNext + GraphQL Federation:跨微服务联合 Schema 分层

ABP VNext GraphQL Federation&#xff1a;跨微服务联合 Schema 分层 &#x1f680; 在微服务架构下&#xff0c;服务之间往往需要相互通信&#xff0c;而 GraphQL Federation 提供了一个有效的解决方案&#xff0c;帮助我们将多个微服务的 GraphQL API 聚合成一个统一的入口…

小程序组件的生命周期,以及在小程序中进行接口请求的方法设置

微信小程序组件生命周期与接口请求方法详解一、小程序组件生命周期微信小程序组件的生命周期指的是组件在不同阶段自动触发的函数&#xff0c;开发者可以利用这些钩子函数在特定时机执行相应操作。小程序组件的生命周期主要分为两类&#xff1a;组件自身生命周期和组件所在页面…

在线游戏玩家与物品交互处理

玩家与物品接触后的判定if (hit ! null && hit.CompareTag("Item")){Debug.Log("捡东西");var worldItem hit.gameObject.GetComponent<WorldItem>();if (worldItem ! null){var inventory GetComponent<PlayerInventory>();if (inv…

深入解析Java Stream 构建:AbstractPipeline

Java Stream 宏观介绍见&#xff1a;深入解析 Java Stream 设计&#xff1a;从四幕剧看流水线设计与执行机制-CSDN博客 PipelineHelper PipelineHelper 是 Java Stream API 内部一个至关重要的辅助类。正如其名&#xff0c;它是一个“管道助手”。可以把它想象成一个执行上下文…

《林景媚与命运回响》

《林景媚与命运回响》——当数据库开始回响命运&#xff0c;现实是否还能被信任&#xff1f;《林景媚数据库宇宙》系列第九部第一章&#xff1a;命运的涟漪公元 2089 年&#xff0c;数据库神谕的运行已趋于稳定&#xff0c;PostgreSQL Quantum Engine&#xff08;PQE&#xff0…

图神经网络入门:从GNN开始01图卷积网络GCN节点分类 02图注意力网络GAT 03图自编码器GAE 04 门控图神经网络GGNN

目录 一.基础1-[图论、图算法、CNN] 二.基础2-[图卷积神经网络GCN] 三.torch-geometric.nn工具包安装&#xff08;包含各种算法和数据集&#xff09; 四.GCN任务[节点分类-Cora 数据集] 五.图注意力网络&#xff08;GAT&#xff09; 六.图自编码器&#xff08;GAE&#x…

001 Configuration结构体构造

目录DramSys 代码分析1 Configuration结构体构造1.1 from_path 函数详解1.2 构造过程总结这种设计的好处2 Simulator 例化过程2.1 instantiateInitiatorDramSys 代码分析 1 Configuration结构体构造 好的&#xff0c;我们来详细解释一下 DRAMSysConfiguration.cpp 文件中 fro…

以太坊十年:智能合约与去中心化的崛起

以太坊10周年&#xff0c;敬开发者&#xff0c;敬构建者&#xff0c;敬还在链上的我们 以太坊即将迎来十周年纪念,作为一名在这个生态中深耕了8到9年的见证者&#xff0c;我亲历了它从一纸白皮书的构想到成长为全球领先去中心化平台的全过程。这十年间&#xff0c;以太坊经历了…

kafka 3.9.1版本: kraft + sasl+ standlone 模式完整可行安装步骤

Kafka 3.9.1 Kraft 单机模式安装 安装 OpenJDK 11 CentOS/RHEL yum install -y java-11-openjdk-develUbuntu/Debian apt install -y openjdk-11-jdk下载安装包 wget https://mirrors.aliyun.com/apache/kafka/3.9.1/kafka_2.12-3.9.1.tgz tar -zxvf kafka_2.12-3.9.1.tgz -C /…