给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深度拷贝。

方法一:

  1. class Solution {
  2. public:
  3. RandomListNode *copyRandomList(RandomListNode *head)
  4. {
  5. if(head == NULL)
  6. return NULL;
  7. map<RandomListNode*, RandomListNode*> check;
  8. RandomListNode *newHead = new RandomListNode(head ->label);
  9. RandomListNode *node1 = head;
  10. RandomListNode *node2 = newHead;
  11. while(node1 ->next)
  12. {
  13. check[node1] = node2;
  14. node2 ->next = new RandomListNode(node1 ->next ->label);
  15. node1 = node1 ->next;
  16. node2 = node2 ->next;
  17. }
  18. check[node1] = node2;
  19. node1 = head;
  20. node2 = newHead;
  21. while(node1)
  22. {
  23. node2 ->random = check[node1 ->random];
  24. node1 = node1 ->next;
  25. node2 = node2 ->next;
  26. }
  27. return newHead;
  28. }
  29. };

方法二:

在每个节点后面复制一个节点

  1. /**
  2. * Definition for singly-linked list with a random pointer.
  3. * struct RandomListNode {
  4. * int label;
  5. * RandomListNode *next, *random;
  6. * RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. RandomListNode *copyRandomList(RandomListNode *head) {
  12. /**
  13. * 假设:l1代表原链表中的节点;l2代表新链表中的节点
  14. */
  15. RandomListNode *new_head, *l1, *l2;
  16. if (head == NULL) return NULL;
  17. /**
  18. * 第一步:在每一个l1后面创建一个l2,并让l1指向l2,l2指向下一个l1;
  19. */
  20. for (l1 = head; l1 != NULL; l1 = l1->next->next) {
  21. l2 = new RandomListNode(l1->label);
  22. l2->next = l1->next;
  23. l1->next = l2;
  24. }
  25. /**
  26. * 第二步:给l2的random赋值,l1的random的next指向的就是l2的random的目标;
  27. */
  28. new_head = head->next;
  29. for (l1 = head; l1 != NULL; l1 = l1->next->next) {
  30. if (l1->random != NULL) l1->next->random = l1->random->next;
  31. }
  32. /**
  33. * 第三步:需要将整个链表拆成两个链表,具体做法是让l1的next指向后面的后面;
  34. * l2的next也指向后面的后面。
  35. */
  36. for (l1 = head; l1 != NULL; l1 = l1->next) {
  37. l2 = l1->next;
  38. l1->next = l2->next;
  39. if (l2->next != NULL) l2->next = l2->next->next;
  40. }
  41. return new_head;
  42. }
  43. };

Leetcode138. Copy List with Random Pointer复制带随机指针的链表的更多相关文章

  1. 138 Copy List with Random Pointer 复制带随机指针的链表

    给出一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点.返回一个深拷贝的链表. 详见:https://leetcode.com/problems/copy-list- ...

  2. 【LeetCode】138. Copy List with Random Pointer 复制带随机指针的链表 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号:负雪明烛 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https:/ ...

  3. LintCode-105.复制带随机指针的链表

    复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 挑战 可否使用O(1)的空间 标签 哈希表 链表 优步 code / ...

  4. Java实现 LeetCode 138 复制带随机指针的链表

    138. 复制带随机指针的链表 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深拷贝. 我们用一个由 n 个节点组成的链表来表示输入/ ...

  5. [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  6. 复制带随机指针的链表 · Copy List with Random Pointer

    [抄题]: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. [思维问题]: [一句话思路]: 完完全全地复制,否则不好操作. 1-> ...

  7. LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer

    给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. A linked list is given such that each no ...

  8. 力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现

    题目描述: 中文: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入:{"$id":" ...

  9. 第35题:LeetCode138. Copy List with Random Pointer

    题目 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 考点 思路 代码 /** * Definition for singly ...

随机推荐

  1. 0讲Java,给你一条简单清晰的学习道路!

    1. 计算机基础: 1.1 数据结构基础: 主要学习:1.向量,链表,栈,队列和堆,词典.熟悉2.树,二叉搜索树.熟悉3.图,有向图,无向图,基本概念4.二叉搜索A,B,C类熟练,9大排序熟悉.5.树 ...

  2. springcloud(十六)、feign+hystrix+ribbon+zuul应用案例

    在 基于 " sringcloud(十四).ribbon负载均衡策略应用案例 "所有工程的基础上,进行如下操作进行网关设置 1.创建eureka-client-consumer-z ...

  3. vue element传的值报_self.$scopedSlots.default is not a function

    问题描述:使用表格时做了v-if判断:首次渲染没有问题:反复操作便会报错: 解决办法:el-table上给v-if的 el-table-colunm 加上:key="Math.random( ...

  4. UNION操作用于合并两个或多个 SELECT 语句的结果集。

    UNION操作用于合并两个或多个 SELECT 语句的结果集. 大理石平台价格 使用示例: $Model->field('name') ->table('think_user_0') -& ...

  5. session过期跳转到登陆页面并跳出iframe框架的两个方法

    最近在做拦截器,判断用户登录后操作超时,失去权限然后要重新登录,但是用的iframe,返回的登陆页总是在框架中显示,我百度了下,总是只有其中一个方法,现在分享下两种解决方法,希望对你们有帮助: 方法一 ...

  6. 莫烦pytorch学习笔记(一)——torch or numpy

    Q1:什么是神经网络? Q2:torch vs numpy Numpy:NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(neste ...

  7. iOS之CATextLayer属性简介

    1.CATextLayer简介 CATextLayer快速高效简单地来渲染纯文本.NSAttributedString /* The text layer provides simple text l ...

  8. Logback 日志组件的使用

    Logback 是由 log4j 创始人设计的又一个开源日志组件. 一. logback 的介绍 ​ logback 当前分成三个模块:logback-core,logback- classic 和 ...

  9. Appium环境安装步骤 + 代码验证环境是否成功

    1.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本. 如下图所示:   如果没有 ...

  10. Linux常用技巧

    1.解决不能中文显示 xshell 终端语言显示选择UTF-8 #yum groupinstall chinese-support 2.heredocument报错“unexpected end of ...