zoukankan      html  css  js  c++  java
  • 剑指offer-复杂链表的复制

    输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

    方法1:先按next建立好初始链表,然后从头结点开始遍历原链表每个节点的random指针需要走几步,在新建立的链表中走同样的步数建立random指针。

    /*
    struct RandomListNode {
        int label;
        struct RandomListNode *next, *random;
        RandomListNode(int x) :
                label(x), next(NULL), random(NULL) {
        }
    };
    */
    class Solution {
        int find(RandomListNode* a,RandomListNode* b){
            int sum=0;
            while(a!=b){
                a=a->next;
                sum++;
            }
            return sum;
        }
    public:
        RandomListNode* Clone(RandomListNode* pHead)
        {
            if(pHead==NULL)
            return NULL;
             RandomListNode* he=pHead;
            RandomListNode* head1=new RandomListNode(he->label);
            RandomListNode* p=head1;
            RandomListNode* q=pHead;
            while(q->next){
                p->next=new RandomListNode(q->next->label);
                p=p->next;
                q=q->next;
            }
            p=head1;
            q=pHead;
            while(p){
                if(q->random==NULL){
                    p->random=NULL;
                }
                else{
                  RandomListNode* po=head1;
                for(int i=0;i<find(pHead,q->random);i++){
                    po=po->next;
                }
                p->random=po;
                }
                p=p->next;
                q=q->next;
            }
            return head1;
        }
    };
    方法2:

    1、复制每个节点,如:复制节点A得到A1,将A1插入节点A后面
    2、遍历链表,A1->random = A->random->next;
    3、将链表拆分成原链表和复制后的链表

     RandomListNode* Clone(RandomListNode* pHead)
        {
            if(!pHead) return NULL;
            RandomListNode *currNode = pHead;
            while(currNode){
                RandomListNode *node = new RandomListNode(currNode->label);
                node->next = currNode->next;
                currNode->next = node;
                currNode = node->next;
            }
            currNode = pHead;
            while(currNode){
                RandomListNode *node = currNode->next;
                if(currNode->random){               
                    node->random = currNode->random->next;
                }
                currNode = node->next;
            }
            //拆分
            RandomListNode *pCloneHead = pHead->next;
            RandomListNode *tmp;
            currNode = pHead;
            while(currNode->next){
                tmp = currNode->next;
                currNode->next =tmp->next;
                currNode = tmp;
            }
            return pCloneHead;
        }
    };

    方法3:

    map关联:将一对复制的节点<N,N'>关联起来,可以直接根据N->random找到N'->random

    class Solution {
    public:
        RandomListNode* Clone(RandomListNode* pHead)
        {
            if(pHead==NULL) return NULL;
     
            map<RandomListNode*,RandomListNode*> m;
            RandomListNode* pHead1 = pHead;
            RandomListNode* pHead2 = new RandomListNode(pHead1->label);
            RandomListNode* newHead = pHead2;
            m[pHead1] = pHead2;
            while(pHead1){
                if(pHead1->next) pHead2->next = new RandomListNode(pHead1->next->label);
                else pHead2->next = NULL;
                pHead1 = pHead1->next;
                pHead2 = pHead2->next;
                m[pHead1] = pHead2;
            }
     
            pHead1 = pHead;
            pHead2 = newHead;
            while(pHead1){
                pHead2->random = m[pHead1->random];
                pHead1 = pHead1->next;
                pHead2 = pHead2->next;
            }
            return newHead;
        }
    };



  • 相关阅读:
    ZOJ Problem Set
    ZOJ Problem Set
    UVa 11464 偶数矩阵 枚举
    poj 1753 枚举
    Codeforces 637D 模拟
    hdu 5631 并查集
    hdu 5438 并查集
    UVa 10129 单词 (有向欧拉路+并查集)
    hdu 3018 欧拉路定理+并查集
    并查集的初步学习
  • 原文地址:https://www.cnblogs.com/nickqiao/p/7583349.html
Copyright © 2011-2022 走看看