复杂链表的复制

来源:互联网 发布:mac excel 公式不计算 编辑:程序博客网 时间:2024/05/29 15:14

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

算法:
第一种:使用辅助空间,复制链表的时候把原链表和新链表一一对应起来。这样当找random 的时候,新链表的random可以通过原链表的random的哈希值取得。

class Solution {public:    RandomListNode* Clone(RandomListNode* pHead)    {        RandomListNode* pNewHead = new RandomListNode(0);        RandomListNode* pnew = new RandomListNode(0);        pNewHead->next = pnew;        if(pHead == NULL)            return pHead;        RandomListNode* pold = pHead;        map<RandomListNode*,RandomListNode*> randomcache;        while(pold != NULL){            RandomListNode* p = new RandomListNode(pold->label);            pnew->next = p;            randomcache[pold] = p;            pold = pold->next;            pnew = pnew->next;        }        //重新开始        pnew = pNewHead->next->next;        pold = pHead;        int k = 0;        while(pnew != NULL){            pnew->random = randomcache[pold->random];            pnew = pnew->next;            pold = pold->next;        }        return pNewHead->next->next;    }};

第二种不需要辅助空间,将复制后的链表与原链表紧挨着放在一起,这样原链表的random指向的位置就是新链表的random指针的上一个位置。

class Solution {public:    RandomListNode* Clone(RandomListNode* pHead)    {        if(pHead == NULL)            return NULL;        //第一步复制链表        RandomListNode* p = pHead;        while (p!=NULL){            RandomListNode* pnew = new RandomListNode(p->label);            RandomListNode* tmp = p->next;            p->next = pnew;            pnew->next = tmp;            p = tmp;        }        //第二步,随即指针的指向        p = pHead;        while (p!=NULL){            if(p->next!=NULL){                if(p->random!=NULL)                    p->next->random = p->random->next;                else                    p->next->random = NULL;                p = p->next->next;            }        }        //第三步,拆分链表        RandomListNode* pnew = new RandomListNode(0);        RandomListNode* q = pnew;        p = pHead;        int k = 1;        while (p->next!=NULL){            q->next = p->next;            q = q->next;            p = p->next;        }        return pnew->next;    }};
0 0