Leecode之随机链表的复制

news2024/11/15 14:10:20

一.题目及剖析

https://leetcode.cn/problems/copy-list-with-random-pointer/

这个题目的意思就是拷贝一份复杂链表,难点在于它的random指针所指向的空间与拷贝下来的链表之间缺少一种联系,当然可以用遍历链表的方式通过value去找那块空间,不过时间复杂度太高.

二.思路引入

所以这道题的重中之重就是怎样让拷贝链表地random和原链表以及之间产生联系

我们不妨引入这样一种方法,在原链表每个节点的后面创建一个新的节点,该节点的值与上个节点相同,这样我们新节点的random指向的空间就是原节点的random指向空间的下一块空间,最后再将新节点从原链表中截下来,并恢复原链表.

三.代码引入

/**
 * 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* pcur = head;
    //在每个节点后面再插入一个相同的节点
    while(pcur)
    {
        Node* copy = (Node*)malloc(sizeof(Node));
        copy->val = pcur->val;
        copy->next = pcur->next;
        pcur->next = copy;
        pcur = pcur->next->next;
    }
    pcur = head;
    //处理random指针指向的节点(copy->random == pcur->random->next)
    while(pcur)
    {
        Node* copy = pcur->next;
        if(pcur->random == NULL)
        copy->random = NULL;
        else
        copy->random = pcur->random->next;
        pcur = pcur->next->next;
    }
    pcur = head;
    Node* newhead = NULL, * newtail = NULL;
    //将对应节点放到新链表中
    while(pcur)
    {
        Node* next = pcur->next;
        pcur->next = next->next;
        if(newtail == NULL)
        newhead = newtail = next;
        else
        {
            newtail->next = next;
            newtail = newtail->next;
        }
        pcur = pcur->next;
    }
    return newhead;
}

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

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

相关文章

hook函数——useState

useState useState是React中的一个Hook函数,用于在函数组件中添加状态。基本使用语法如下: const [state, setState] useState(initialState) state:表示当前状态的值setState:更新状态的函数initialState:初始状态…

Java基础(二十四):网络编程

Java基础系列文章 Java基础(一):语言概述 Java基础(二):原码、反码、补码及进制之间的运算 Java基础(三):数据类型与进制 Java基础(四):逻辑运算符和位运算符 Java基础(五):流程控制语句 Java基础(六)&#xff1…

[Python] 函数详讲

可莉将这篇博客收录在了:《Python》 可莉推荐的一位优质博主:Keven ’ bloghttp://t.csdnimg.cn/6iwnv 跟着可莉一起学习,一篇文章来带你理解Python中的函数的奥秘~ 一、语法格式 定义函数 def 函数名(形参列表):#函数体return 返回值 调用函…

猫头虎分析:如何利用ChatGPT及生成式AIGC提高工作效率 ‍

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

小区创业项目推荐:小投资大回报的店铺类型

作为一位拥有5年鲜奶吧创业经验的自媒体博主,我深知在小区内寻找一个既小投资又能带来大回报的创业项目是多么重要。今天,我要为大家推荐的,正是这样一个项目——鲜奶吧。 一、鲜奶吧:小区内的健康食品新宠 随着健康饮食观念的深…

【SpringBoot】JWT令牌

📝个人主页:五敷有你 🔥系列专栏:SpringBoot ⛺️稳重求进,晒太阳 什么是JWT JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于各方面之间安全的将信息作为JSON对象传输…

mac终端怎么恢复初始设置?图文教程不想看看吗?

某网友说“不小心把终端弄成了这样?请问该怎么办呢?mac终端怎么恢复初始设置?” 其实,这个问题不难,在终端中选择【还原初始值】即可。 Mac终端初始化具体怎么操作?话不多说,图文教程分享给大…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士,您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作,拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中,我们将介绍当今…

前端学习之路(6) npm详解

npm 是什么? npm(node package manager):node.js 的包管理器,用于node插件管理(包括安装、卸载、管理依赖等) ,npm 是随同 node.js 一起安装的包管理工具,能解决 node.j…

Redis 基本认识

文章目录 Redis八个特性Redis应用场景Redis应用缺陷Redis使用流程 Redis八个特性 速度快 原因: ① 单线程,避免了多线程竞争(如加锁/解锁)的时间开销 ② redis的数据存放在内存中 ③ 使用C语言编写,C语言更方便操做硬件 ④ Redis 源码优秀 利用键值对存…

新手指南:Postman 旧版本(历史版本)下载

随着技术的不断发展,有时候我们发现自己需要退回到使用 Postman 某个以往的版本。这篇文章旨在指导你如何安全地移除当前版本的 Postman、查找并获取旧版本。 从你的系统中移除 Postman 为了确保旧版本的 Postman 可以无障碍地安装,首先得从你的系统中…

嵌入式中经典面试题分析

1.关键字static的作用是什么?为什么static变量只初始化一次? 1)修饰局部变量:使得变量变成静态变量,存储在静态区,存储在静态区的数据周期和程序相同, 在main函数开始前初始化,在退…

国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪

最近声学所东海站邹博士发来了他们最新的浅地层剖面仪—MPAS-100相控参量阵浅地层剖面仪的资料,市场型号GeoInsight,委托Ocean Physics Technology公司销售,地大李师兄的公司负责技术支持。 MPAS-100相控参量阵浅地层剖面仪就是俗称的三维浅…

Unity类银河恶魔城学习记录4-1,4-2 Attack Logic,Collider‘s collision excepetion源代码 P54 p55

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; u…

C/C++ - 容器vector

目录 容器特性 构造函数 默认构造函数 填充构造函数 范围构造函数 拷贝构造函数 内存布局 大小函数 size() 函数 capacity() 函数 empty() 函数 resize() 函数 增加函数 push_back(const T& value) emplace_back(Args&&... args) push_back和empla…

linux(redhat)重置root密码

首先将root密码改成几乎不可能记住的密码 [rootexample ~]# echo fheowafuflaeijifehowf|passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.重启系统,进入救援模式 出现此页面,按e键 lin…

一个简单的2024龙年倒计时页面html源码

预览如下 复制粘贴下面的代码&#xff0c;另存为html文件即可打开&#xff0c;文字链接都可以更改&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>2024新年倒计时</title> <style>::-webki…

Linux操作系统基础(二):Linux操作系统概述

文章目录 Linux操作系统概述 一、Linux起源 二、Linux 的含义 三、Linux发行版 Linux操作系统概述 一、Linux起源 Linux创始人——林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间实现的 Linux的特点&#xff1a;开源、免费、拥有最为庞大的源码贡献者 …

Mac安装Homebrew+MySQL+Redis+Nginx+Tomcat等

Mac安装HomebrewMySQLRedisNginxTomcat等 文章目录 Mac安装HomebrewMySQLRedisNginxTomcat等一、Mac安装Mysql 8①&#xff1a;下载②&#xff1a;安装③&#xff1a;配置环境变量④&#xff1a;外部连接测试 二、Mac安装Redis和可视化工具①&#xff1a;安装Redis01&#xff1…

STL常用容器—set容器

STL常用容器—set容器 1. set容器相关概念2. 初始化容器3. set容器插入和删除4. set容器大小和交换5. set容器的查找和统计6. set、multiset、unordered_set三者的区别7. pair对组的创建8. set容器的排序 参考博文&#xff1a;STL常用容器——set容器的使用 1. set容器相关概念…