题解 | #复杂链表的复制#

复杂链表的复制

http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba

复杂链表的复制

利用哈希表记录原节点和复制链表节点间映射(通过原节点直接找到对应的复制节点),

  1. 先建立next链表(不含random指向)
  2. 通过哈希表(遍历哈希表),根据原节点的random指向(有原节点和复制节点的映射)直接得到复制节点的random指向。

alt

如图:建立好next指向的复制链表后,遍历哈希表。

原节点4的random指向2, 复制节点指向复制节点的2(即 m[4->random] ),因为原2节点和复制节点2映射。

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
        if(!pHead)return NULL;
        unordered_map<RandomListNode*,RandomListNode*> m;
        RandomListNode* head = pHead->next,*hclone = new RandomListNode(pHead->label),*he = hclone;
        m[pHead] = hclone;
        while(head){
            RandomListNode* clone = new RandomListNode(head->label);
            m[head] = clone;//节点和复制节点的映射。
            hclone->next = clone;
            hclone = hclone->next;
            head = head->next;
        }
        for(auto &[key,value] : m){
            value->random = (key->random == NULL ? NULL : m[key->random]);
        }
        return he;
    }
    
};
全部评论

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
Noel_:中石油是这样的 哥们侥幸混进免笔试名单 一看给我吓尿了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务