LeetCode Copy List with Random Pointer
2015-09-06 10:30
465 查看
思路:
因为存在random指针,所以如果顺序复制,可能存在还没有某个节点就必须通过random指向该节点的情况出现,因此这种方法不可取。
我们需要利用链表指针间的关系巧妙的复制:
(1)顺序的扫描一遍链表,在每个节点的后面复制一个相应的节点,先不考虑random指针的指向。
(2)再顺序的扫描一遍链表,处理random指针。
(3)再顺序的扫描一遍链表,分开新旧链表。
时间复杂度O(N),空间复杂度O(1)。
因为存在random指针,所以如果顺序复制,可能存在还没有某个节点就必须通过random指向该节点的情况出现,因此这种方法不可取。
我们需要利用链表指针间的关系巧妙的复制:
(1)顺序的扫描一遍链表,在每个节点的后面复制一个相应的节点,先不考虑random指针的指向。
(2)再顺序的扫描一遍链表,处理random指针。
(3)再顺序的扫描一遍链表,分开新旧链表。
时间复杂度O(N),空间复杂度O(1)。
/** * 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 *old1 = head, *old2 = head->next; while(old1 != NULL) { old1->next = new RandomListNode(old1->label); old1->next->next = old2; old1 = old2; if(old2 != NULL) { old2 = old2->next; } } //处理random指针的深复制 old1 = head; RandomListNode *new1 = head->next; while(old1 != NULL) { if(old1->random == NULL) { new1->random = NULL; }else { new1->random = old1->random->next; } old1 = old1->next->next; if(new1->next != NULL) { new1 = new1->next->next; } } //拆分新旧链表 RandomListNode *copy = head->next; old1 = head, new1 = head->next; while(new1->next != NULL) { old1->next = new1->next; old1 = new1; if(new1->next != NULL) { new1 = new1->next; } } old1->next = NULL; new1->next = NULL; return copy; } };
相关文章推荐
- Linux(erjiwenjianxitong)
- 应该知道的Linux技巧
- linux把EDT时间修改为CST格式
- Linux_shell——第5章 一团乱麻?没这回事
- linux内核移植到S5pv210
- 28个Unix/Linux的命令行神器
- linux 网线插拔检测
- Linux_shell——第4章 让文本飞
- [Linux] Git: push 出错的解决 master -> master (branch is currently checked out)
- 你可能不知道的Shell
- Linux_shell——第3章 以文件之名
- Linux基础-硬
- 【LINUX】——gvim中如何配置字体和背景
- Linux_shell——第2章 命令之乐
- Hbase总结:Hbase中的Coprocessor
- Gate架构
- opencv Imread问题两则
- 自己动手实现使用最小堆解决Topk问题
- 测试限制域名网站的方法
- CentOS 系统各个目录的作用详解