复杂链表的复制(二)

有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。


思路:

如果没有random pointer那是极容易的,顺着链表走读一遍 ,逐个拷贝节点并链接即可,有了random pointer后,其实也就是加上了记录random pointer的关系而已,考虑到random pointer可以往前指,也可以往后指,则必须全部遍历完才能完整地建立起random pointer对应关系表,记录对应关系,当然用map的数据结构啦,c++不太熟,查了下文档也不难写这么个基本的数据结构,用两个map,一个保存原始链表的random指向,另一个记录原始链表和新建链表按照节点顺序建立的对应关系,这样在走读完原始链表所有节点后,再刷一遍两个map就可以恢复新建链表中与原始链表random指向对应的random 指针了,为了省空间,当然map的元素都用int*表示

/**
 * 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) {
        if(head==NULL)
        {
           return NULL;
        }
        std::map<RandomListNode*, RandomListNode*> parall;
        std::map<RandomListNode*, RandomListNode*> randpoint;

        RandomListNode * pleft=head;
        RandomListNode * copyList=new RandomListNode(pleft->label);
        
        RandomListNode * pright=copyList;
        parall.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pright));
        randpoint.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pleft->random));
        pleft=pleft->next;
        while(pleft!=NULL)
        {
           //create corresponding node
            RandomListNode* tmpRight=new RandomListNode(pleft->label);
            pright->next=tmpRight;
            pright=pright->next;
            
            parall.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pright));
 
            randpoint.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pleft->random));
 
            pleft=pleft->next;
        }

        for( std::map<RandomListNode*, RandomListNode*>::iterator ii=randpoint.begin(); ii!=randpoint.end(); ++ii)
        {
           if((*ii).second!=NULL)
           {
               parall[(*ii).first]->random=parall[(*ii).second];
           }
        }
        
        return copyList;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值