当前位置: 首页 > news >正文

[LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

这道链表的深度拷贝题的难点就在于如何处理随机指针的问题,由于每一个节点都有一个随机指针,这个指针可以为空,也可以指向链表的任意一个节点,如果我们在每生成一个新节点给其随机指针赋值时,都要去遍历原链表的话,OJ上肯定会超时,所以我们可以考虑用Hash map来缩短查找时间,第一遍遍历生成所有新节点时同时建立一个原节点和新节点的哈希表,第二遍给随机指针赋值时,查找时间是常数级。代码如下:

解法一:

class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        if (!head) return NULL;
        RandomListNode *res = new RandomListNode(head->label);
        RandomListNode *node = res;
        RandomListNode *cur = head->next;
        map<RandomListNode*, RandomListNode*> m;
        m[head] = res;
        while (cur) {
            RandomListNode *tmp = new RandomListNode(cur->label);
            node->next = tmp;
            m[cur] = tmp;
            node = node->next;
            cur = cur->next;
        }
        node = res;
        cur = head;
        while (node) {
            node->random = m[cur->random];
            node = node->next;
            cur = cur->next;
        }
        return res;
    }
};

当然,如果使用哈希表占用额外的空间,如果这道题限制了空间的话,就要考虑别的方法。下面这个方法很巧妙,具体细节可参见神网友水中的鱼的博客,该方法可以分为以下三个步骤:

1. 在原链表的每个节点后面拷贝出一个新的节点

2. 依次给新的节点的随机指针赋值,而且这个赋值非常容易 cur->next->random = cur->random->next

3. 断开链表可得到深度拷贝后的新链表

解法二:

class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        if (!head) return NULL;
        RandomListNode *cur = head;
        while (cur) {
            RandomListNode *node = new RandomListNode(cur->label);
            node->next = cur->next;
            cur->next = node;
            cur = node->next;
        }
        cur = head;
        while (cur) {
            if (cur->random) {
                cur->next->random = cur->random->next;
            }
            cur = cur->next->next;
        }
        cur = head;
        RandomListNode *res = head->next;
        while (cur) {
            RandomListNode *tmp = cur->next;
            cur->next = tmp->next;
            if(tmp->next) tmp->next = tmp->next->next;
            cur = cur->next;
        }
        return res;
    }
};

本文转自博客园Grandyang的博客,原文链接:拷贝带有随机指针的链表[LeetCode] Copy List with Random Pointer ,如需转载请自行联系原博主。

相关文章:

  • UIM卡 PIN 码特点
  • 详解在visual studio中使用git版本系统(图文)
  • 我来做百科(第五天)
  • POJ-1502 MPI Maelstrom
  • Oracle -- 字符集编码'GBK'库数据导入到'UFT-8'库中 大量报错 ORA-12899 解决方案
  • IOS-创建带Navigation的根控制器
  • .Net IOC框架入门之一 Unity
  • 过 DNF TP 驱动保护(一)
  • 数组倒序输出
  • EF架构~XMLRepository仓储的实现
  • 上海南站(2007-04-07)
  • ORACLE使用EXPDP和IMPDP数据泵进行导出导入的方法
  • 乾颐堂HCIE面试真题系列4,附考场外景,缓解大家的紧张情绪
  • tomcat访问(access)日志配置、记录Post请求参数
  • 求排列求组合的实现
  • JavaScript中的对象个人分享
  • MySQL数据库运维之数据恢复
  • MySQL主从复制读写分离及奇怪的问题
  • oldjun 检测网站的经验
  • passportjs 源码分析
  • PHP的Ev教程三(Periodic watcher)
  • Python学习之路13-记分
  • React系列之 Redux 架构模式
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 分布式事物理论与实践
  • 解析带emoji和链接的聊天系统消息
  • 一个完整Java Web项目背后的密码
  • 优秀架构师必须掌握的架构思维
  • C# - 为值类型重定义相等性
  • kubernetes资源对象--ingress
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Java NIO(一)FileChannel
  • #Linux(权限管理)
  • #pragma预处理命令
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C++20) consteval立即函数
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (poj1.3.2)1791(构造法模拟)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (zt)最盛行的警世狂言(爆笑)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十五)使用Nexus创建Maven私服
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET6 开发一个检查某些状态持续多长时间的类
  • @Autowired和@Resource装配
  • @Query中countQuery的介绍
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2023-年度总结]凡是过往,皆为序章
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记