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.

深度复制:

仅简单的遍历一遍链表时,没法复制random pointer属性。所以有点懵,大神的做法如下,加入个人理解。

思路:对链表进行三次遍历。

第一次遍历复制每一个结点,将新结点接在原结点的后面, 让链表变成一个重复链表,新旧交替;

第二次遍历维护新结点的随机指针,因,新结点是在旧结点之后,所以node->next->random=node->random->next,而node->node结点为新结点,这样,我们就把新结点的随机指针接好了;

第三次遍历,将两新旧结点分开,因为,构成的重复链表是新旧结点交替出现,故,只要每隔一个节点相连即可,就完成了对链表的分割。如下图:

 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         if(head==NULL)  return NULL;
14
15         //第一步,在oldNode的后面插入一个新的结点
16         RandomListNode *oldNode=head;
17         while(oldNode !=NULL)
18         {
19             RandomListNode *newNode=new RandomListNode(oldNode->label);
20             newNode->next=oldNode->next;
21             newNode->random=oldNode->random;
22             oldNode->next=newNode;
23             oldNode=newNode->next;  //遍历前行
24         }
25
26         //第二步,关联random
27         oldNode=head;
28         while(oldNode !=NULL)
29         {
30             if(oldNode->random !=NULL)
31                 oldNode->next->random=oldNode->random->next;
32             oldNode=oldNode->next->next;
33         }
34
35         //第三步,分开两链表
36         RandomListNode *newList=new RandomListNode(0);
37         newList->next=head;
38         RandomListNode *pHead=newList;
39
40         oldNode=head;
41         while(oldNode !=NULL)
42         {
43             pHead->next=oldNode->next;
44             oldNode->next=pHead->next->next;
45
46             pHead=pHead->next;
47             oldNode=oldNode->next;
48         }
49
50         return newList->next;
51     }
52 };

转载于:https://www.cnblogs.com/love-yh/p/7009489.html

[Leetcode] Copy list with random pointer 对带有任意指针的链表深度拷贝相关推荐

  1. leetcode 138. Copy List with Random Pointer | 138. 复制带随机指针的链表(复杂链表的复制)

    题目 https://leetcode.com/problems/copy-list-with-random-pointer/ 题解 复杂链表的复制,经典问题,考察与 HashMap 的结合.注意如果 ...

  2. LeetCode Copy List with Random Pointer

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

  3. LeetCode || Copy List with Random Pointer

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

  4. LeetCode 138. Copy List with Random Pointer

    LeetCode 138. Copy List with Random Pointer 参考链接:http://www.cnblogs.com/grandyang/p/4261431.html Sol ...

  5. leetcode -day8 Copy List with Random Pointer Single Number I II

    五一中间断了几天,开始继续... 1.  Copy List with Random Pointer A linked list is given such that each node cont ...

  6. 138. Copy List with Random Pointer

    /** 138. Copy List with Random Pointer * 2016-5-22 by Mingyang* 要遍历两次,第一次用来找到所有的next节点,并且把新旧节点全部存在ha ...

  7. python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表

    链表--深度拷贝一个带有随机指针的链表 链表--深度拷贝一个带有随机指针的链表 本文介绍两种解法. 解法1:利用一个map ListNode *copyRandomList(ListNode *hea ...

  8. LeetCode OJ - Copy List with Random Pointer

    题目: A linked list is given such that each node contains an additional random pointer which could poi ...

  9. 【LeetCode】Copy List with Random Pointer

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

最新文章

  1. 技术图文:如何实现 DataTable 与模型类 List 的相互转换?
  2. java怎么复制动态数组_Java 数组排序复制等操作(Java Arraycopy)
  3. 微软谈开源、赦盗版背后的商业逻辑
  4. 如何破解无线路由器密码,如何破解WEP密码,破解无线路由器
  5. DEBUG_NEW和THIS_FILE
  6. 用户修改了信息jwt服务器怎么识别,jwt验证登录信息
  7. C++ rand,srand用法
  8. 将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML
  9. matlab 四叉树表达,已知二值图像,如题图8.4所示。 (1)对该图像使用四叉树进行划分; (2)用四叉树表达该图像。 - 试题答案网问答...
  10. ArcMap|时空地理加权回归(GTWR)
  11. NSOperation
  12. PowerPoint.Application win32 操作ppt 复制 新建 插入图片
  13. 红米手机开启开发者模式方法
  14. Conflux CTO伍鸣、研究总监杨光分别出席CoinDesk发布会及YOUChain大会
  15. px4调用Gazebo实现四旋翼定点悬停到时降落
  16. Pytorch的grad、backward()、zero_grad()
  17. bzoj3265 志愿者招募加强版
  18. 【基础】什么是网关以及网关作用
  19. 视觉SLAM笔记(33) 对极约束求解相机运动
  20. “小论文”杂谈之二:如何选择一篇好文章

热门文章

  1. C语言标准数学函数库math.h之常用函数介绍
  2. 30段极简Python代码:这些小技巧你都Get了么
  3. Linux vim编辑器命令总结(转载)
  4. c++/c SM4加密解密算法代码实现
  5. 物联网行业网络解决方案_2021物联网趋势:有望从物联网传感器网络中受益的5大行业...
  6. 005_Queue消息模式发送字节消息
  7. python绘制饼图的列表有none_python 有没有库或者函数,类似R的corrplot,画相关系数图的时候,每个方框里面为饼图?...
  8. kaggle房价预测特征意思_R语言实战:复杂数据处理和分析之Kaggle房价预测
  9. 虚拟服务器设置upnp,TP-Link路由器如何设置UPNP开启【设置步骤】
  10. 学计算机科学与技术考研考哪些专业课程,计算机科学与技术考研考哪些科目 备考技巧有哪些...