Copy List with Random Pointer的解题报告
来源:互联网 发布:软件开发赚钱吗 编辑:程序博客网 时间:2024/06/05 20: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.
题目就是让你复制一个单链表,但是该链表有一个特殊的地方,每个节点含有一个随机指针,可能指向任何一个节点,这是题目的难点。
解题思路:最常规的方法应该是利用map关联容器。将原节点和复制节点关联起来,然后通过map的关联关系,将原链表中的随机指针复制进复制链表中。以下是代码,大概思路是先生成一个与原链表相同的只有next指针的单链表,并且将新旧节点关联起来,然后在遍历一遍原链表,将随机指针复制进去。
/** * 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) { RandomListNode *original=head; if(head==NULL)return NULL; RandomListNode *newlist; map<RandomListNode*,RandomListNode*> mark; RandomListNode *newnode=new RandomListNode(0); newnode->label=head->label; newlist=newnode; mark.insert(make_pair(head,newlist)); while(original->next!=NULL) { newnode=new RandomListNode(0); newlist->next=newnode; original=original->next; newlist=newlist->next; newlist->label=original->label; mark.insert(make_pair(original,newlist)); } original=head; while(original!=NULL) { mark[original]->random=mark[original->random]; original=original->next; } return mark[head]; }};除了这个方法以外,还有一个更巧妙的算法,这个方法不用保存原始链表的映射关系,构建新节点时,指针做如下变化,即把新节点插入到相应的旧节点后面:
同理分两步
1、构建新节点random指针:new1->random = old1->random->next, new2->random = NULL, new3->random = NULL, new4->random = old4->random->next
2、恢复原始链表以及构建新链表:例如old1->next = old1->next->next, new1->next = new1->next->next
该算法时间复杂度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 *pos1 = head, *pos2 = head->next; while (pos1 != NULL) { pos1->next = new RandomListNode(pos1->label); pos1->next->next = pos2; pos1 = pos2; if (pos2 != NULL) pos2 = pos2->next; } pos1 = head; pos2 = head->next; while (pos1 != NULL) { if (pos1->random == NULL) { pos2->random = NULL; } else { pos2->random = pos1->random->next; } pos1 = pos1->next->next; if (pos2->next != NULL) pos2 = pos2->next->next; } RandomListNode *res = head->next; pos1 = head; pos2 = head->next; while(pos2->next != NULL) { pos1->next = pos2->next; pos1 = pos2; if (pos2->next != NULL) pos2 = pos2->next; } pos1->next = NULL; pos2->next = NULL; return res; }};
0 0
- Copy List with Random Pointer解题报告
- Copy List with Random Pointer 解题报告
- 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] 138. Copy List with Random Pointer 解题报告
- [Leetcode] 138. Copy List with Random Pointer 解题报告
- [leetcode]138. Copy List with Random Pointer@Java解题报告
- JAVA学习44_leetCode解题报告之Copy List with Random Pointer
- leetcode解题笔记-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
- 移动应用UI设计(下)
- 设计模式第一篇——简单工厂模式&类图
- C++ primer plus(第六版)学习笔记、习题答案(3)
- 51单片机资源扩展:从片内ROM跳转到片外ROM
- JQuery实现数据格式化
- Copy List with Random Pointer的解题报告
- JS中的call()和apply()方法
- Microsoft Office 2007 无法正常卸载怎么办?
- poj解题报告——1426
- Java多线程-工具篇-BlockingQueue
- JS日期(Date)处理函数总结
- POJ 题目2406 Power Strings(KMP)
- 计算机网络笔记《一》
- base64那点事