复杂链表的复制

来源:互联网 发布:迅捷路由器主人网络 编辑:程序博客网 时间:2024/05/17 04:13

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。


/*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==NULL)return NULL;        RandomListNode *tmp=pHead;        //copy the nodes        while(tmp)        {            RandomListNode *tmpNew=new RandomListNode(tmp->label);            tmpNew->next=tmp->next;            tmp->next=tmpNew;            tmp=tmp->next->next;        }         tmp=pHead;        //copy the random        while(tmp)        {            if(tmp->random)                tmp->next->random=tmp->random->next;            tmp=tmp->next->next;        }         //split src and dst list        RandomListNode *retHead=new RandomListNode(0);        RandomListNode *dst=retHead;        tmp=pHead;        while(tmp)        {            RandomListNode *m=tmp->next;            tmp->next=m->next;            tmp=tmp->next;             dst->next=m;            dst=m;        }        return retHead->next;    }};
关于复杂链表的复制分析:

1.节点值复制

2.next指针复制

3.random指针复制

问题的难点在怎么复制random指针?因为random指针是随机指的,所以第一步先不用给random指针赋值,先初始化所有节点的值再说。那么random指针到底怎么赋值?考虑一个原链表,一个复制链表。原链表中的某个节点的随机指针,或者说关系怎样映射到新的复制链表中呢?上述代码采取的处理办法是:复制链表时压根就不新建一个链表,而是这样放

1-1'-2-2'-3-3'

1'、2'、3'为新复制的节点,那么新节点的random指针关系可以由原链表的指针节点关系求得。

tmp->next->random=tmp->random->next;
如此,random指针关系复制好了,但是要将原链表和复制链表分开了。



0 0
原创粉丝点击