【数据结构和算法】面试必刷之随机链表复制:这三步让你彻底吃透 random 指针

【数据结构和算法】面试必刷之随机链表复制:这三步让你彻底吃透 random 指针
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

随机链表的复制是数据结构中的经典难题,核心难点在于复制节点的random指针——其指向的节点可能尚未创建,也可能指向链表中的任意节点。本文采用“原地拷贝+拆分”的最优思路,分三步拆解解题逻辑,结合代码实现与原理分析,清晰讲解如何高效解决该问题,帮助读者吃透random指针的处理技巧,掌握链表操作的核心思维。

一、随即链表的复制

1.1 题目

链接:随机链表的复制

在这里插入图片描述


在这里插入图片描述

1.2 算法原理

第一步:依次拷贝每个节点放在原节点后面

在这里插入图片描述


第二步:处理random指针指向 — 新链表 == (旧链表)random->next

第三步:把拷贝节点依次取下来尾插成新链表

1.3 代码

*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;*};*/ typedef struct Node* Node; struct Node*copyRandomList(struct Node* head){//拷贝每个节点放在原节点后面 Node cur = head;while(cur){ Node copy =(Node)malloc(sizeof(struct Node)); copy->val = cur->val; copy->next = cur->next; cur->next = copy; cur = copy->next;}//处理拷贝链表的random cur = head;while(cur){ Node copy = cur->next;if(cur->random ==NULL) copy->random =NULL;else copy->random = cur->random->next; cur = copy->next;}//把拷贝链表从原链表摘下来成为新链表 cur = head; Node copyhead =NULL; Node copytail =NULL;while(cur){ Node copy = cur->next; Node next = copy->next;//没有节点 + 有一个节点 if(copytail ==NULL) copyhead = copytail = copy;else{ copytail->next = copy; copytail = copytail->next;} cur = next;}return copyhead;}

总结与每日励志

✨本文详细讲解了随机链表复制的完整解法,核心是通过“原地拷贝节点、关联random指针、拆分链表”三步,在O(n)时间复杂度和O(1)空间复杂度内完成复制,避开了random指针带来的难点。每一道算法题都是思维的锤炼,每一次代码调试都是能力的提升。愿你在技术学习的道路上,保持严谨与耐心,不畏惧难题,不敷衍细节,永远相信美好的事情即将发生,用坚持与积累,解锁更多算法奥秘,奔赴属于自己的成长之路

在这里插入图片描述

Read more

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

FLASH坏块监测系统 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 开发一个 FLASH 坏块监测系统,能够监测 FLASH 中坏块的数量。FLASH 介质以一个大小为 m×n的二维二进制矩阵表示,其中:0 表示正常,1 表示异常。最初,FLASH 介质中的所有单元格都是正常(即,所有单元格都是 0)。 系统运行过程中,FLASH 坏块不断产生:随着系统持续运行,某一个时刻 i,FLASH 介质中的某个单元格 (ri,ci)由正常变为异常。返回一个整数数组 result,其中 result[i] 是 FLASH 介质中第

By Ne0inhk
JDK21安装与配置教程

JDK21安装与配置教程

文章目录 * 一、下载JDK * 1. 下载地址 * 2. 下载JDK21 * 二、JDK21安装及配置 * 1. 解压zip压缩包 * 2. 配置Java环境变量 * 2.1 打开系统属性设置 * 2.2 新建系统环境变量 * 2.3 编辑 PATH 环境变量 * 2.4 验证环境变量是否配置成功 一、下载JDK 1. 下载地址 华为云镜像下载地址: 地址 1(OracleJDK):https://repo.huaweicloud.com/java/jdk/ 地址 2(OpenJDK):https://mirrors.huaweicloud.com/openjdk/ 地址

By Ne0inhk
Java 中间件:RocketMQ 顺序消息(全局/分区顺序)

Java 中间件:RocketMQ 顺序消息(全局/分区顺序)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java中间件这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 中间件:RocketMQ 顺序消息(全局 / 分区顺序) * 什么是顺序消息? * RocketMQ 顺序消息的工作原理 * 全局顺序 vs 分区顺序 * RocketMQ 顺序消息的核心机制 * 全局顺序消息的实现 * 全局顺序的配置要求 * Java 代码示例:全局顺序消息 * 全局顺序的局限性 * 分区顺序消息的实现 * 分区顺序的设计思路 * Java 代码示例:分区顺序消息 * 分区顺序的关键要点 * 顺序消息的消费机制详解 * ConsumeOrderlyStatus 枚举 * 消费失败的处理机制 * 并发消费 vs 顺序消费

By Ne0inhk
【JAVA全栈项目】弧图图-智能图床SpringBoot+MySQL API接口结合Redis+Caffeine多级缓存实践解析

【JAVA全栈项目】弧图图-智能图床SpringBoot+MySQL API接口结合Redis+Caffeine多级缓存实践解析

文章案例具体代码链接:https://github.com/whltaoin/hututu 提交版本:e67453a26f0bbe78ce075a550bafb01ba82aa9ff 简言 在后端开发中,API接口是服务间通信的核心载体,而数据存储与缓存策略则直接决定了接口的性能与稳定性。Spring框架凭借其强大的生态成为API开发的首选,MySQL作为关系型数据库提供了可靠的数据持久化支持。当系统并发量提升时,单一数据库架构易出现性能瓶颈,此时引入Redis(分布式缓存)与Caffeine(本地缓存)构建多级缓存体系,成为优化性能的关键方案。本文将从基础实现出发,深入探讨多级缓存的优势、劣势、适用场景及实践注意点。 文章目录 * 简言 * 一、基础架构:Spring+MySQL实现API接口 * 1.1 核心组件与依赖 * 1.2 核心实现流程 * 二、多级缓存:Redis+Caffeine的组合逻辑 * 2.1 组件特性对比 * 2.2 多级缓存工作流程 * 三、多级缓存的优势与劣势

By Ne0inhk