您的位置:首页 > 其它

复杂链表的复制(二)

2015-12-14 23:11 218 查看
有一个复杂链表,其结点除了有一个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;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: