链表OJ题【环形链表】(3)

目录

环形问题的思考

❓Q1

❓Q2

🙂Q2 

❓Q3

❓Q4

8.环形链表

9.环形链表Ⅱ


今天接着链表的经典问题环形问题。大家一定要自己动手多写写。🙂

  • 快慢指针(保持相对距离/保持相对速度)
  • 野指针
  • 考虑为NULL的情况
  • 带环链表:尾节点的next指向链表中的任意点(甚至可能指向它自己)
  • 循环条件
  • 结论

环形问题的思考

假设现有一个链表是带环的,请你做出如下思考和证明! (环形链表如下)

❓Q1

slow一次走1步,fast一次走2步,他们一定会相遇吗?(slow在走满一圈之前)

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间距离缩小一步,不会出现每次刚好是套圈的情况。

  • 因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇  

❓Q2

slow一次走1步,fast一次走3步,他们一定会相遇吗?

  • 如果N是偶数第一圈就直接追上了。
  • 如果N是奇数,C是奇数,C-1是偶数,第二圈也追上了。
  • 如果N是奇数,C是偶数,C-1是奇数,永远追不上。
  • N是slow开始入环,fast的最初开始追击的距离。
  • C是环的长度。 

🙂Q2 

在上面的基础上,请问N是奇数,C是偶数,C-1是奇数这个条件是否成立。请证明! 

  • 起点到入环的距离:L
  • N是slow开始入环,fast的最初开始追击的距离。
  • 环的长度:C
  • slow每次走1步
  • fast每次走3步
  • 关键点:从开始位置到slow入环的路程,速度是3倍关系,同一时间段,路程是3倍的关系。
  • 结论:N是奇数,C是偶数,C-1是奇数这个条件不成立。 

❓Q3

slow一次走n步,fast一次走m步,他们一定会相遇吗?(m>n>1)

  • 如果  N%(m-n) == 0 第一圈就直接追上了。
  • 如果  N%(m-n) == x 第一圈也追不上了。
  • 如果  (C-x)%(m-n) == 0 第二圈就追上了。
  • 如果  (C-x)%(m-n)  != 0   永远追不上了。
  • N是slow开始入环,fast的最初开始追击的距离。
  • C是环的长度。 

❓Q4

请证明:

让一个指针slow链表起始位置开始遍历链表,同时让一个指针fast判环时相遇点的位置开始绕环运行,注意slow每次走1步,fast每次走1步,最终肯定会在入口点的位置相遇。

  •  起点到入环的距离:L
  • 入口点到相遇点:X
  • 环的长度:C
  • slow每次走1步
  • fast每次走2步
  • 关键点:从起始点到相遇点路程。速度是二倍关系。同一时间段,路程也是2倍的关系。
  • 结论:一个指针从相遇点开始走,一个指正从头开始走,他们会在入口点相遇

8.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。 

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

【快慢双指针】

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) 
{
    struct ListNode *faster=head;
    struct ListNode *slow=head;
    //一起走faster走2步 slow走1步--保持相对速度
    while(faster && slow && faster->next)
    {
        faster=faster->next->next;
        slow=slow->next;
        if(slow == faster)
        {
            return true;
        }
    }
    return false;
}

//另外写法

bool hasCycle(struct ListNode *head) 
{
    struct ListNode *faster=head;
    struct ListNode *slow=NULL;
    if(head == NULL)
    {
        return false;
    }
    while(faster != slow)
    {
        if(slow == NULL)
        {
            slow=head;
        }
        if(faster == NULL || faster->next == NULL)
        {
            return false;
        }
        faster=faster->next->next;
        slow=slow->next;
    }
    return true; 
}

 

9.环形链表Ⅱ

 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

【快慢指针】

  • 找到相遇的地方
  • 让一个指针slow链表起始位置开始遍历链表,同时让一个指针fast判环时相遇点的位置开始绕环运行,注意slow每次走1步,fast每次也走1步,最终会在入口点的位置相遇。(结论)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode *slow=head;
    struct ListNode *fast=head;
    struct ListNode *meet=NULL;
    while(fast && fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(fast == slow)
        {
            slow=head;
            while(fast != slow)
            {
                slow=slow->next;
                fast=fast->next;
            }
            return fast;
        }
    }
    return NULL;
}


 【链表的相交】

感谢各位!下篇我们开始双向链表的学习。一起加油💪小伙伴们! 

【链表练习题】链表知识点题库 - 力扣(LeetCode)

 牛客网在线编程_算法篇_面试必刷TOP101 (nowcoder.com)

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java14新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 今天我们来一起看一下Java14这个版本的一些重要信息 版本介绍 Java 14…

No180.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【图像处理:OpenCV-Python基础操作】

【图像处理:OpenCV-Python基础操作】 1 读取图像2 显示图像3 保存图像4 图像二值化、灰度图、彩色图,像素替换5 通道处理(通道拆分、合并)6 调整尺寸大小7 提取感兴趣区域、掩膜8 乘法、逻辑运算9 HSV色彩空间,获取特定…

【算法每日一练]-单调队列,滑动窗口(保姆级教程 篇1) #滑动窗口 #求m区间的最小值 #理想的正方形 #切蛋糕

今天讲单调队列 目录 题目:滑动窗口 思路: 题目:求m区间的最小值​ 思路: 题目:理想的正方形 思路: 题目:切蛋糕 思路: 一共两种类型:一种是区间中的最值&…

游戏制作:猜数字(1~100),不会也可以先试着玩玩

目录 1 2代码如下:可以试着先玩玩 3运行结果:嘿嘿嘿 4程序分析:想学的看 5总结: 1 猜数范围为1~100,猜大输出猜大了,猜小输出猜小了,游戏可以无限玩。 首先先做一个简单的菜单界面&#xf…

RK3588平台 WIFI的基本概念

一.安卓WIFI框架 Android WIFI系统引入了wpa_supplicant,它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。Android WIFI主要分为六大层,分别是WiFi Settings层,Wifi Framework层,Wifi JNI 层, W…

WorkPlus Meet:局域网内部使用的高效视频会议系统

随着全球化和远程办公的趋势,视频会议已成为现代企业和机构不可或缺的沟通工具。而现在,大多数政企单位或者涉密强的企业,都会使用局域网部署的音视频会议系统,提供更高的安全性和隐私保护。因为音视频会议中可能涉及到公司机密和…

Torch Hub 系列#2:VGG 和 ResNet

一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…

自动泊车轨迹规划学习

1.基于6次多项式的自动泊车轨迹算法研究 针对常见的自动泊车系统无法躲避障碍物,以及轨迹的曲率不连续等问题进行了泊车轨迹算法的研究以及跟踪算法的设计。 针对低速自动泊车场景进行分析,建立符合对应场景下的车辆运动学模型以及能够泊车的最小车位大…

华为dns mapping配置案例

解决内网PC用公网的dns用域名方法访问公司内网的web服务器: 原理是用DNS mapping方式解决 配置过程:域名——出口公网IP地址——公网端口——协议类型 公司内网client用户填公网dns, 公网上的dns上面已注册有公司对外映射的web服务器的公网…

山西电力市场日前价格预测【2023-11-13】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-13)山西电力市场全天平均日前电价为428.16元/MWh。其中,最高日前电价为751.89元/MWh,预计出现在18: 30。最低日前电价为289.03元/MWh,预计…

【MySQL系列】 第一章 · MySQL概述

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

王道 | 数据结构第一章

目录结构 章节总览 1.0 开篇_数据结构在学什么 1.1_1 数据结构的基本概念 1.1_2 数据结构的三要素 1.2_1 算法的基本概念 1.2_2 算法的时间复杂度 1.2_3 算法的空间复杂度 章节总览 1.0 开篇_数据结构在学什么 1.1_1 数据结构的基本概念 数据: 数据是信息的载…

数据库加密的常用方法 安当加密

数据库加密的方法主要有以下几种: 前置代理及加密网关技术:在数据库之前增加一道安全代理服务,对数据库访问的用户都必须经过该安全代理服务,在此服务中实现如数据加解密、存取控制等安全策略。加密数据存储在安全代理服务中。但…

OpenCV:图像旋转与缩放

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

人工智能基础——图像认知与OpenCV

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

Adversarial Training Methods for Deep Learning: A Systematic Review

Adversarial Training Methods for Deep Learning: A Systematic Review----《面向深度学习的对抗训练方法:系统回顾》 摘要 通过快速梯度符号法(FGSM)、投影梯度下降法(PGD)和其他攻击算法,深度神经网络暴露在对抗攻击的风险下。对抗性训练是用来防御对抗性攻击威…

DBeaver:强大实用的跨平台数据库工具 | 开源日报 No.71

dbeaver/dbeaver Stars: 34.3k License: Apache-2.0 DBeaver 是一个免费的多平台数据库工具,适用于开发人员、SQL 程序员、数据库管理员和分析师。它支持任何有 JDBC 驱动程序的数据库,并且商业版本还支持非-JDBC 数据源 (如 MongoDB、Cassandra 等)。该…

pandas笔记:读写excel

1 读excel read_excel函数能够读取的格式包含:xls, xlsx, xlsm, xlsb, odf, ods 和 odt 文件扩展名。 支持读取单一sheet或几个sheet。 1.0 使用的数据 1.1 主要使用方法 pandas.read_excel(io, sheet_name0, header0, namesNone, index_colNone, usecolsNon…

基于Matlab+ AlexNet神经网络的动物识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Matlab和AlexNet神经网络的动物识别系统可以用于自然图像识别等场景,以下是一个基本的介绍设计步骤…