地址:http://oj.leetcode.com/problems/copy-list-with-random-pointer/
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指针。
接下来第二次遍历,某一个节点的random指针,比如p1的random指向px,px与copy链表里新创建的节点通过map找到的是px^, p1与copy里新创节点通过map找到的是p1^,那么p1^的random指向的就是px^。
第17行map插入的时候开始写的是dm.insert(make_pair<p, pnew>). 给报了两次compile error
后来改成了强制转化的形式,但是忘记了加pair。
这样三次compile error了后一次AC了,汗。这样的题应该多做,打上两颗*。
参考代码:
/**
* 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) {
map<RandomListNode*, RandomListNode*> dm;
RandomListNode* p = head, *lastp = NULL, *newhead = NULL;
while(p)
{
RandomListNode* pnew = new RandomListNode(p->label);
dm.insert(pair<RandomListNode*, RandomListNode*>(p, pnew));
if(p!=head)
{
lastp->next=pnew;
lastp = lastp->next;
}
else
{
newhead = lastp = pnew;
}
p = p->next;
}
p = head;
while(p)
{
dm[p]->random = dm[p->random];
p = p->next;
}
return newhead;
}
};
class Solution {public:RandomListNode *copyRandomList(RandomListNode *head) {if(!head)return head;unordered_map<RandomListNode*, RandomListNode*>mp;RandomListNode *p = head, *q = NULL, *pre = NULL;while(p){q = new RandomListNode(p->label);mp[p] = q;p = p->next;if(pre)pre->next = q;pre = q;}p = head;while(p){mp[p]->random = mp[p->random];p = p->next;}return mp[head];}};
python:
# Definition for singly-linked list with a random pointer.# class RandomListNode:# def __init__(self, x):# self.label = x# self.next = None# self.random = Noneclass Solution:# @param head, a RandomListNode# @return a RandomListNodedef copyRandomList(self, head):if not head:return head;mp = {}p = headpre = Nonewhile p:q = RandomListNode(p.label)mp[p] = qif pre:pre.next = qpre = qp = p.nextp = headwhile p:if p.random:mp[p].random = mp[p.random]else:mp[p].random = Nonep = p.nextreturn mp[head]