题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路

对此问题,每个指针节点存在两个链域,一个指向下一节点,另一个指向任意节点。首要需要完成的是对节点进行复制,然后对复制后的节点间的指向关系进行复制。
此问题分为三步来解决,时间复杂度为O(n):
step1:在原节点基础上,对每个节点进行复制,并将复制节点插入被复制节点之后。
step2:由于复制节点是被复制节点的滞后一个单位位置的点,所以当被复制节点存在一个特殊指针指向某一节点时,复制节点也应执行相同操作,而复制节点特殊指针的指向,一定是被复制节点特殊指针指向节点的下一个节点元素,按此规则对链表中所有节点进行遍历,完成特殊指针指向复制。
setp3:将原链表与复制链表分离,由于原链表与复制链表的元素交叉相连,所以直接按照交替顺序遍历就可实现两个链表的分离。
C++代码实现如下:
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
clone1(pHead);
clone2(pHead);
RandomListNode* head= clone3(pHead);
return head;
}
void clone1(RandomListNode* pHead){
//step1: 逐个复制列表元素,并重新复制一个链表 if(pHead==NULL){
return;
}
RandomListNode* pNode=pHead;
while(pNode!=NULL){ RandomListNode* newNode=new RandomListNode(pNode->label);
newNode->next=pNode->next;
pNode->next=newNode;
pNode=newNode->next;
}
}
void clone2(RandomListNode* pHead){
//step2:设置随机指针的指向
if(pHead==NULL){
return;
}
RandomListNode* pNode=pHead;
while(pNode!=NULL){
RandomListNode* pNode2=pNode->next;
if(pNode->random!=NULL){
pNode2->random=pNode->random->next;
}
pNode=pNode2->next;
}
}
RandomListNode* clone3(RandomListNode* pHead){
if(pHead==NULL){
return NULL;
}
RandomListNode* pNode1=pHead;
RandomListNode* Head2=pNode1->next;
RandomListNode* pNode2=pNode1->next;
pNode1->next=pNode2->next;
pNode1=pNode1->next;
while(pNode1!=NULL){
pNode2->next=pNode1->next;
pNode2=pNode2->next;
pNode1->next=pNode2->next;
pNode1=pNode1->next;
}
return Head2;
}
};

最新文章

  1. windows server 2012 r2 远程桌面连接指南
  2. WCF Data Service
  3. Java-java中无符号类型的处理
  4. Fragment详解之三——管理Fragment(1)
  5. Delphi XE8,C++ Builder XE8,RAD Studio XE8 官方 ISO 文件下载,附激活工具
  6. 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触
  7. java面试笔试试题http://www.jobui.com/mianshiti/it/java/6827/
  8. Android:PopupWindow简单弹窗改进版
  9. SSL构建单双向https认证
  10. 私有静态方法private static method-值得用吗?
  11. ASP.NET MVC 中的 T4
  12. hdu4771 Stealing Harry Potter's Precious
  13. 【第二篇】学习 android 事件总线androidEventbus之异步事件的传递
  14. SQLITE3 使用总结(3~5)(转)
  15. 学习Linux下的文件目录管理
  16. ubuntu中利用qtcreator引用opencv249及采起采集卡的共享库
  17. Java基础——详尽说明try-catch-finally的用法
  18. Python -- Windows编程 -- 注册表
  19. Visual Studio AI 离线模型训练(window 7)
  20. 20135320赵瀚青LINUX第七周学习笔记

热门文章

  1. Hacker Fest: 2019 Vulnhub Walkthrough
  2. 1.Android-入门之系统架构介绍
  3. MYSQL 游标学习及使用实例
  4. Android 开机充电图标和充电动画
  5. NGUI 源码分析- AnchorPoint
  6. IT兄弟连 HTML5教程 “无意义”的HTML元素div和span
  7. rsync高级同步工具
  8. 使用vue脚手架快速创建vue项目(入门)
  9. DataGridView自动保存列的宽度和位置
  10. 解决方案:从网站下载Excel,我的Office 2016,打开excel文件,显示空白