数据结构——链表专题3

news2024/11/27 2:24:23

文章目录

  • 一、判断链表是否有环
  • 二、返回入环的第一个节点
  • 三、随机链表的复制

一、判断链表是否有环

原题链接:判断链表是否有环
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这道题可以使用快慢指针,fast一次走两步,slow一次走一步,如果有环,它们在环里面必定会相遇

在这里插入图片描述

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

那么为什么一定会相遇呢?

对于快指针一次走两步来说,在slow进环后,假设slow与fast的距离为N

在这里插入图片描述

很明显,快指针走两步时,慢指针走一步,在进环后它们之间的差距为1,所以它们一定会相遇

那么快指针走三步?四步?五步呢?现在让我们证明一下:
现在我们规定快指针走三步,那么在进环后它们之间的差距为2

在这里插入图片描述
如果N是偶数那么在slow进环后一圈之内就能遇见fast
如果N是奇数那么在slow进环后一圈之内不能遇见fast,fast会超越slow一步,那么就不能相遇了吗?

在这里插入图片描述

假设在slow进环前,走过的距离是L,环的长度为C,fast在环内走过的距离为XC,slow进环时,slow与fast之间的距离为N

在这里插入图片描述
在这里插入图片描述

现在我们分析N是奇数的情况:
在这里插入图片描述

很好,现在我们只需要分析N为奇数时,C为偶数的情况是否存在?
在这里插入图片描述
结论:一定能追上
当N是偶数时,一轮就能追上
当N是奇数时,第一轮追不上,第二轮能追上

二、返回入环的第一个节点

原题链接:返回入环的第一个节点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:先使用快慢遍历链表,用meet指针指向它们相遇的结点,然后用pcur指针指向链表的头结点
最后让pcur和meet指针同时移动,每次移动一步,最终它们会在环的头结点相遇

在这里插入图片描述
在这里插入图片描述

struct ListNode *detectCycle(struct ListNode *head)
{
    if(head == NULL)
    {
        return head;
    }
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
        {
            struct ListNode* meet = slow;
            struct ListNode* pcur = head;
            while(meet != pcur)
            {
                meet = meet->next;
                pcur = pcur->next;
            }
            return meet;
        }
    }
    return NULL;
}

证明:为什么meet指针一定与pcur指针在环头结点相遇?

假设在slow进环前,走过的距离是L,环的长度为C,fast在环内走过的距离为XC,
在slow位于链表的头结点时,fast与环的头结点之间的距离为N

在这里插入图片描述

三、随机链表的复制

原题链接:随机链表的复制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:
在原链表的基础上,在每个结点后面创建一个新结点,这个新结点保存着前面结点的数据
然后将新结点的random指针指向对应的位置
最后将新的结点从原链表上面脱离(此过程中可以选择恢复原链表),形成新的链表

在这里插入图片描述

struct Node* copyRandomList(struct Node* head)
{
    //拷贝原结点
	struct Node* pcur = head;
    while(pcur)
    {
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        if(copy == NULL)
        {
            exit(1);
        }
        copy->val = pcur->val;
        copy->next = pcur->next;
        pcur->next = copy;
        pcur = copy->next;
    }
    //拷贝random指针
    pcur = head;
    while(pcur)
    {
        struct Node* copy = pcur->next;
        if(pcur->random == NULL)
        {
            copy->random = NULL;
        }
        else
        {
            copy->random = pcur->random->next;
        }
        pcur = copy->next;
    }
    //脱离原链表
    pcur = head;
    struct Node* phead = NULL;
    struct Node* ptail = NULL;
    while(pcur)
    {
        struct Node* copy = pcur->next;
        struct Node* next = copy->next;
        if(phead == NULL)
        {
            phead = ptail = copy;
        }
        else
        {
            ptail->next = copy;
            ptail = ptail->next;
        }
        //恢复原链表
        pcur->next = next;
        pcur = next;
    }
    return phead;
}

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

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

相关文章

SAP-ABAP-视图

1、什么是视图? 当需要查询多个表中的某些字段的数据时,就可以使用视图。视图不影响数据库中的数据,仅作为查询手段或工具。 2、视图类型: 数据库视图和维护视图经常使用。 3、创建视图SE11 3.1、数据库视图 可以直接输入表名…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-计算机与组成原理

👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️进入狂砍分⭐ ⭐软件设计师高频考点文档, ⭐软件设计师高频考点专栏 ⭐⭐ 🎶(1) 考点6,流水线 考点:流水线相关的计算 可…

《QT实用小工具·六十》Qt 多列时间轴控件

1、概述 源码放在文章末尾 Qt 多列时间轴控件。 可与多段字符串格式自由转换,也可手动添加列表项。 专门用来以时间轴作为事件线发展顺序的故事大纲。 特点 时间背包功能:记录所有物品或属性发生的变化,随时回溯 时间可输入任意内容&…

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号,不管是声音还是光线,这些模拟信号需要被 A/D 转换器转换成数字信…

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC(系统级芯片)处理器,适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU,集成了GPU、MCU、NPU、VPU等多种计算核心,并具有丰富的外…

我的256天之创作纪念日

目录 时光 数据的一些变化 开心的事 憧憬 时光 自上次CSDN的消息推送,又一个128天过去了,整天的工作和生活都在忙忙碌碌中度过,每到能静下来片刻,都倍感珍惜。因为一些原因,能够陪伴家人的时间越来越少&#xff…

【LLM 论文】OpenAI 基于对比学习微调 LLM 得到嵌入模型

论文:Text and Code Embeddings by Contrastive Pre-Training ⭐⭐⭐⭐ OpenAI 一、论文速读 这篇论文基于大型生成式 LLM 通过对比学习来微调得到一个高质量的 text 和 code 的 embedding 模型。 训练数据的格式:是一堆 ( x i , y i ) (x_i, y_i) (x…

前端nginx(windows操作系统)学习配置开发验证

Nginx概述 Nginx 作为负载均衡在 Linux 系统上具备很好的并发性能,并且占用极小的内存。但是在 Windows 系统上并不支撑较高并发,所以在Windows系统上选用Nginx作为负载均衡,需要考虑并发情况。 若并发需求低于 300,部署集群仅以…

Spring的基本应用

概述:Spring是由Rod Johnson组织开发的一个分层的java SE/EE一站式的轻量级开源框架,以IOC(控制反转)和AOP(面向切面)为核心,的开发模式。 注:喜欢的朋友可以关注公众号“JAVA学习课堂”系统学习相关技术&a…

ElasticSearch知识点汇总

1、ES中的​​​​​​​倒排索引是什么。 倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤: 心跳检测: 每个节点…

【消息队列】MQ介绍

MQ MQ(MessageQueue),中文是消息队列,就是存放消息的队列,也是下面提到的事件驱动架构中的Broker 同步调用的优点: 时效性强,可以立即得到结果 同步调用的问题: 耦合度高性能和吞吐…

基于 llama2 的提示词工程案例2

优化大型语言模型(LLMs) 优化大型语言模型(LLMs)中的提示词(prompts)是提高模型性能和输出相关性的重要手段。以下是一些优化提示词的方向: 明确性:确保提示词清晰明确,…

【Java 刷题记录】前缀和

前缀和 25. 一维前缀和 示例1: 输入: 3 2 1 2 4 1 2 2 3输出: 3 6import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(S…

【强化学习】公平性Actor-Critic算法

Bringing Fairness to Actor-Critic Reinforcement Learning for Network Utility Optimization 阅读笔记 Problem FormulationLearning AlgorithmLearning with Multiplicative-Adjusted RewardsSolving Fairness Utility Optimization Evaluations 在网络优化问题中&#xff…

PyGame 文字显示问题及解决方法

在 Pygame 中显示文字时可能会遇到一些问题,例如文字显示不清晰、字体不正确或者文字位置不准确等。以下是一些常见的问题及其解决方法,具体情况可以看看情况。 1、问题背景 一位用户在使用 PyGame 库进行游戏开发时,遇到了一个问题&#xf…

[AI OpenAI-doc] 迁移指南 Beta

我们已经改变了助手 API 在 beta 的 v1 版本和 v2 版本之间工具和文件的工作方式。今天,通过 API,两个 beta 版本仍然可以访问,但我们建议尽快迁移到我们 API 的最新版本。我们将在 2024 年底之前废弃 beta 的 v1 版本。 如果您今天不使用助手…

套管外径测量仪 多尺寸型号 规格全可定制

套管(bushing)是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管,后者称为穿墙套管。套管通常用在建筑地下室,是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

SpringBoot中HandlerInterceptor拦截器的构建详细教程

作用范围:拦截器主要作用于Spring MVC的DispatcherServlet处理流程中,针对进入Controller层的请求进行拦截处理。它基于Java的反射机制,通过AOP(面向切面编程)的思想实现,因此它能够访问Spring容器中的Bean…

Python-VBA函数之旅-property函数

目录 一、property函数的常见应用场景 二、property函数使用注意事项 三、如何用好property函数? 1、property函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博客 一、prop…

【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…