1. 程式人生 > >輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。

本題源自LeetCode

--------------------------------------------

1  先複製節點,讓複製節點插入節點的後面。

2 調整隨機指標,複製節點的隨機指標指向節點隨機指標的下一個節點

3 將連結串列拆分開

 RandomListNode *copyRandomList(RandomListNode *head) {
        cloneListNode(head);
        cloneRandom(head);
        return reconnectNodes(head);
        
    }
    
    //複製節點,在節點的後面
    void cloneListNode(RandomListNode *head){
        RandomListNode *p=head;
        while(p!=NULL){
        	RandomListNode *cloneNode=new RandomListNode(p->label);
            cloneNode->next=p->next;
            cloneNode->random=NULL;
            p->next=cloneNode;
            p=cloneNode->next;
        }
    }
    
    //複製隨機指標
    void cloneRandom(RandomListNode *head){
        RandomListNode *p=head;
        while(p!=NULL){
            RandomListNode *cloneNode=p->next;
            if(p->random!=NULL)
            	cloneNode->random=p->random->next;
            p=cloneNode->next;
        }
    }
    //拆分連結串列
    RandomListNode* reconnectNodes(RandomListNode* head){
        if(head == NULL)
            return NULL;
        RandomListNode* p=head;
        RandomListNode *cloneHead=p->next;
        RandomListNode *cloneNode=cloneHead;
        p->next=cloneNode->next;
        p=p->next;
        while(p!=NULL){
            cloneNode->next=p->next;
            cloneNode=cloneNode->next;
            p->next=cloneNode->next;
            p=p->next;
        }
        return cloneHead;
    }