【Leetcode】Copy List with Random Pointer
来源:互联网 发布:施乐s1810网络设置 编辑:程序博客网 时间:2024/04/25 16:59
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.
题意:存在一个链表,里面有两个指针,一个指针指向下一节点,另一指针指向链表的任意节点或者NULL,要求是深复制一个完全一样的链表并返回。
思路:此题一开始的思路是先遍历链表,遍历一个节点新建一个节点,然后可以指定next指针,当整个链表都完成初始化后,再新旧两个表逐个遍历random指针,这样可以实现所要的功能,但是超时了。
后来没想到什么好的方式,就查了一下资料,发现可以这样做,如图:
然后在上图的基础上进行如下两步
1、构建新链表的random指针:比如new1->random = new1->random->random->next, new2->random = NULL, new3-random = NULL, new4->random = new4->random->random->next
2、恢复原始链表:根据最开始保存的原始链表next指针映射关系恢复原始链表
该算法时间空间复杂度均为O(N)。
为了保存最初的链表顺序,声明了一个vector,用于指定恢复原始链表。代码如下:
/** * 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; RandomListNode *Head = new RandomListNode(head->label); RandomListNode *p = head; RandomListNode *q = Head; vector<RandomListNode*> backup; backup.push_back(p); while(p->next) { RandomListNode *temp = p; p = p->next; backup.push_back(p); RandomListNode *node=new RandomListNode(p->label); temp->next = q; q->next = node; q->random = temp; q = node; } p->next = q; q->random = p; q = Head; while(q) { if(q->random->random) q->random = q->random->random->next; else q->random = NULL; q = q->next; } for(int i=0;i<backup.size()-1;i++) { backup[i]->next = backup[i+1]; } backup[backup.size()-1]->next = NULL; return Head; }};
0 0
- [leetcode][list] 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 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: Copy List with Random Pointer
- LeetCode | Copy List with Random Pointer
- [LeetCode] Copy List with Random Pointer
- LeetCode OJ:Copy List with Random Pointer
- LeetCode(138)Copy List with Random Pointer
- [LeetCode] - Copy List with Random Pointer
- X-mind 破解 方法
- 次小生成树
- slidingMenu的使用教程
- windows 下检测进程cpu使用率
- 数据库使用中经常忘记的问题
- 【Leetcode】Copy List with Random Pointer
- Android RelativeLayout用到的一些重要的属性
- 求最短路径
- Linux命令大全
- NHibernate初学 之 增删改查
- dsp C优化-(四)
- Leetcode_letter-combinations-of-a-phone-number
- 张家辉章子怡获2014金像奖影帝影后 一代宗师获多奖项
- mySql数据库的一些操作