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.
Accept: 154ms, C++
思路:
- 题目的难点在于Node里的random指针可能指向后面的一个节点,当deep copy时,结果链表的那个节点还没创建出来,如何解决指向“future”节点的问题。
- 解决思路:
- 过2遍链表,第一遍吧所有节点copy到结果链表里、并用一个map记录旧链表节点和新链表节点的对应关系,第二遍吧random指针指向的旧链表节点映射到新链表节点里。
- 由于使用了map,所以时间略长,可以用hashmap替代,预计能提高很多,不过由于标准STL里没有,只是体力活,就不再优化了。
/**
* 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) {}
* };
*/
#include <map>
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if (head == NULL) {
return NULL;
}
RandomListNode *result = new RandomListNode(head->label);
_old2new[head] = result;
RandomListNode *p = result;
for (RandomListNode *i = head->next; i != NULL; i = i->next) {
p->next = new RandomListNode(i->label);
p = p->next;
_old2new[i] = p;
}
p = result;
for (RandomListNode *i = head; i != NULL; i = i->next, p = p->next) {
if (i->random) {
p->random = _old2new[i->random];
}
}
return result;
}
private:
std::map<RandomListNode*, RandomListNode*> _old2new;
};