【牛客网】copy-list-with-random-pointer题解
来源:互联网 发布:淘宝村级服务站申请 编辑:程序博客网 时间:2024/04/30 14:55
题目
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; }};
0 0
- 【牛客网】copy-list-with-random-pointer题解
- LeetCode题解:Copy List with Random Pointer
- LeetCode - Copy List with Random Pointer 题解
- LeetCode: Copy List with Random Pointer题解
- leetcode - Copy List with Random Pointer题解
- LeetCode题解:Copy List with Random Pointer
- LeetCode 题解(88): Copy List with Random Pointer
- LeetCode题解——Copy List with Random Pointer
- leetcode题解-138. Copy List with Random Pointer
- leetcode题解-138. Copy List with Random Pointer
- leetcode题解-138. Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- 流媒体传输协议详解发布完成
- UIImagePickerController使用
- 进程间、线程间通信方式小结
- 关于 enctype="multipart/form-data" 属性问题
- ext4 文件系统概述
- 【牛客网】copy-list-with-random-pointer题解
- 在一台电脑上运行两个tomcat
- [Leetcode]290. Word Pattern
- 挑战 超大背包问题
- 解决打开文件夹,每次都在新的窗口中
- CSS3 border
- python django 数据库查询方法总结
- R语言data.table速查手册
- 何为语法树