您的位置:首页 > 运维架构

LeetCode | Copy List with Random Pointer(赋值带有随机指针的链表)

2014-08-20 11:52 423 查看
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.

题目解析:

这道题在剑指offer上看到过,由于情况比较复杂,如果对于随机指针,每次都要遍历一次确定位置,就时间复杂度就达到O(n^2)。

方案一:hash表

我们复制结点的时候,保存<N,N'>配对信息在哈希表中。第二遍的时候再对随机指针进行赋值,由于有配对信息,那么当N->next = m的时候,我们找到 m' 就好了。就能很快的查找到目标。

典型的利用空间换取时间的方法。

方案二:分治法的特殊应用

现在的方案是,将新的结点全部创建到纠结点后面,那么新结点的random就为p->random->next;这样就方便赋值了。

最后要将新旧链表都恢复。

class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == NULL)
return head;

RandomListNode *p = head;
while(p){
RandomListNode *q = new RandomListNode(p->label);
q->next = p->next;
p->next = q;
p = q->next;
}
p = head;
while(p){
RandomListNode *q;
q = p->next;
if(p->random)   //由于已经在初始化的时候将新创建的结点random指针赋值为NULL不用处理
q->random = p->random->next;    //必须要在p->random非空的时候,才能next。
p = q->next;
}
RandomListNode *clonehead = head->next;
RandomListNode *pclone = clonehead;
RandomListNode *h = head;   //同时恢复两个链表
while(pclone->next){
h->next = pclone->next;
pclone->next = pclone->next->next;
pclone = pclone->next;
h = h->next;
}
h->next = NULL; //不要忘了赋值为NULL
return clonehead;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐