【数据结构和算法】面试必刷之随机链表复制:这三步让你彻底吃透 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

LeetCode 热题 100 之 54.螺旋矩阵

LeetCode 热题 100 之 54.螺旋矩阵

解题思路(边界模拟法) 我们可以通过维护四个边界(上、下、左、右)来模拟顺时针螺旋遍历的过程: 1. 从左到右遍历当前上边界的行,然后上边界向下移动。 2. 从上到下遍历当前右边界的列,然后右边界向左移动。 3. 如果上下边界仍有未遍历的行,则从右到左遍历当前下边界的行,然后下边界向上移动。 4. 如果左右边界仍有未遍历的列,则从下到上遍历当前左边界的列,然后左边界向右移动。 5. 重复以上步骤,直到所有边界交叉,遍历结束。 Java 代码实现 public class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new ArrayList<>(); if (matrix

By Ne0inhk
深度解析算法之模拟

深度解析算法之模拟

39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。 注意:你 不能 修改非 '?' 字符。 题目测试用例保证 除 '?' 字符 之外,不存在连续重复的字符。 在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。 示例 1: 输入: s = “?zs” 输出:“azs” 解释: 该示例共有 25 种解决方案,从 “azs”

By Ne0inhk
【强化学习】近端策略优化算法(PPO)万字详解(附代码)

【强化学习】近端策略优化算法(PPO)万字详解(附代码)

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:        【强化学习】- 【单智能体强化学习】(9)---《近端策略优化算法(PPO)详解》 近端策略优化算法(PPO)详解 目录 PPO算法介绍 1. 背景 2. PPO 的核心思想 3. PPO 流程 4. 为什么 PPO 很强? 5. PPO 的直观类比 PPO算法的流程推导及数学公式 1. 背景与目标 2. PPO的概率比率 3. 优化目标 4. 值函数优化 5. 策略熵正则化

By Ne0inhk
【算法通关指南:数据结构和算法篇 】队列相关算法题:3.海港

【算法通关指南:数据结构和算法篇 】队列相关算法题:3.海港

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、海港 * 1.1题目 * 1.2算法原理 * 1.3代码 * 总结与每日励志 前言 本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长 一、海港 1.1题目 链接:海港 1.2算法原理 先来的乘客,在时间逐渐增大的时候会先出列。因此,可以用队列模拟整个过程。 • 队列里面存每⼀

By Ne0inhk