劍指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;
    }
};



發佈了106 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章