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结点为新结点,这样,我们就把新结点的随机指针接好了;

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

 /**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head)
{
if(head==NULL) return NULL; //第一步,在oldNode的后面插入一个新的结点
RandomListNode *oldNode=head;
while(oldNode !=NULL)
{
RandomListNode *newNode=new RandomListNode(oldNode->label);
newNode->next=oldNode->next;
newNode->random=oldNode->random;
oldNode->next=newNode;
oldNode=newNode->next; //遍历前行
} //第二步,关联random
oldNode=head;
while(oldNode !=NULL)
{
if(oldNode->random !=NULL)
oldNode->next->random=oldNode->random->next;
oldNode=oldNode->next->next;
} //第三步,分开两链表
RandomListNode *newList=new RandomListNode();
newList->next=head;
RandomListNode *pHead=newList; oldNode=head;
while(oldNode !=NULL)
{
pHead->next=oldNode->next;
oldNode->next=pHead->next->next; pHead=pHead->next;
oldNode=oldNode->next;
} return newList->next;
}
};

最新文章

  1. echarts 用marlkline画线 同时配置中含有datazoom,怎么设置markline
  2. 【原创】刚刚发现的SVN的几个有用的功能
  3. Redis-复制
  4. angularjs中关于当前路由再次点击强制刷新
  5. php构造函数实例讲解
  6. c/c++ 数字转成字符串, 字符串转成数字
  7. Android URI简介
  8. openocd 如何支持FreeRTOS 8.1.2
  9. qq安全原理
  10. CSS实现动画特效导航栏
  11. 普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎。。。。。 测试。。测试。。。没刷过微博。屯里来的。看看啥效果
  12. python数学第一天【极限存在定理】
  13. 【翻译】Nginx的反向代理
  14. 安装php7.2并且整合nginx且分开部署
  15. Chrome firefox ie等浏览器空格( )兼容问题
  16. Hadoop 系列(一)基本概念
  17. 测试Linux端口的连通性的四种方法
  18. 什么是Mybatis
  19. Median of Two Sorted Arrays(hard)
  20. swiper 、css3制作移动端网站,折叠导航

热门文章

  1. php+sqlserver处理读取decimal 类型数据,不满1的数字会去掉0的问题
  2. labview在编写程序框图中遇到的一些布尔按钮控制布尔指示灯问题
  3. POJ 3210 : Coins
  4. ORACLE中order by造成分页不正确原因分析
  5. 3 python3 编码解码问题 upd接受数据
  6. loj2587 「APIO2018」铁人两项
  7. nginx proxy_cache缓存详解
  8. linux命令大全(转载)
  9. 在Linux中安装和配置OpenVPN Server的最简便方法!
  10. Github上的1000多本免费电子书重磅来袭!