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

复杂链表的复制

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;
    }
    
};
全部评论

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务