【牛客网】copy-list-with-random-pointer题解
2016-07-14 15:54
309 查看
题目
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的指向关系,并在新链表中体现。代码
1.常规思路:利用map存储原链表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) return NULL; map<RandomListNode*, RandomListNode*> source_2_copy; //记录node对应关系 source_2_copy.insert(make_pair((RandomListNode*)NULL,(RandomListNode*)NULL)); //random pointer为NULL RandomListNode *copy_head=new RandomListNode(head->label); source_2_copy.insert(make_pair(head,copy_head)); RandomListNode *p_copy=copy_head; RandomListNode *p_source=head->next; //链表复制 while(p_source){ p_copy->next=new RandomListNode(p_source->label); source_2_copy.insert(make_pair(p_source,p_copy->next)); p_copy=p_copy->next; p_source=p_source->next; } p_source=head; p_copy=copy_head; //random pointer复制 while(p_source){ p_copy->random=(source_2_copy.find(p_source->random))->second; p_source=p_source->next; p_copy=p_copy->next; } return copy_head; } };
2.Bright Way:在原链表上为每个node new一个副本,然后拆分原链表,同时修改random pointer。(此方法会破坏原链表)
/** * 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) return NULL; RandomListNode *p=head; //copy node while(p){ RandomListNode *copy=new RandomListNode(p->label); copy->next=p->next; copy->random=p->random; p->next=copy; p=p->next->next; } p=head->next; //get new list while(p){ if(p->next) p->next=p->next->next; if(p->random) p->random=p->random->next; p=p->next; } return head->next; } };
相关文章推荐
- Hadoop+Hive部署安装配置
- opengl 学习资料
- Linux运维工程师入门须掌握的10个技术点
- Tomcat内存设置详解
- VMwareVsphere在克隆部署Linux虚拟机后网卡的相关操作
- 运行基准测试hadoop集群中的问题:org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /benchmarks/TestDFSIO/io_data/test_
- 马哥linux 教程---vim编辑器进阶课后题
- cronolog分割tomcat的catalina.out日志
- LiLinux系统下如何修改主机名
- Mac上Apache部署本地PHP工程虚拟地址
- linux 配置多个tomcat(本文配置了两个)
- 结合Android使用的Linux命令
- linux下查看磁盘空间
- 解决centos下apache不区分路径大小写问题
- 【OpenCV笔记 05】OpenCV插入文本和字体设置相关函数
- mac opengl glutInit编译出错
- Spark vs Hadoop MapReduce
- centos下安装mysql
- linux C 加载so文件 指定路径
- 谈Hadoop下各技术应用场景