[劍指 Offer]複雜鏈表的複製

[劍指 Offer]複雜鏈表的複製

劍指 Offer-複雜鏈表的複製

題目描述

請實現 copyRandomList 函數,複製一個複雜鏈表。在複雜鏈表中,每個節點除了有一個 next 指針指向下一個節點,還有一個 random 指針指向鏈表中的任意節點或者 null。

示例 1:
在這裏插入圖片描述
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:
在這裏插入圖片描述
輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]

示例 3:
在這裏插入圖片描述
輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]

示例 4:
輸入:head = []
輸出:[]
解釋:給定的鏈表爲空(空指針),因此返回 null。

提示:
-10000 <= Node.val <= 10000
Node.random 爲空(null)或指向鏈表中的節點。
節點數目不超過 1000 。

解題思路
  • 每個節點的後面插入複製的節點,如 1 -> 2 -> 3 ->4 -> null 複製完就是 1 -> 1 -> 2 -> 2 -> 3 - > 3 -> 4 ->4 -> null
  • 給新插入的節點的random賦值
  • 拆分
實現代碼
class Solution {
public:
    Node* copyRandomList(Node* head) {   
        if(head==NULL)
            return NULL;    
        //插入新節點 1->2->3->null  ——> 1->1->2->2->3->3->4->4->null
        for(Node* p=head;p!=NULL;p=p->next->next){
            Node* temp=new Node(p->val);
            temp->next=p->next;            
            p->next=temp;
        }
        //建立新節點的random
        for(Node* p=head;p!=NULL;p=p->next->next){
            if(p->random==NULL)
                p->next->random=NULL;
            else
                p->next->random=p->random->next;
        }
        //拆分
        Node* p=head;
        Node* copyhead=p->next;
        Node* q=p->next;
        while(1){
            p->next=q->next;
            p=p->next;
            if(p==NULL)
                break;
            q->next=p->next;
            q=q->next;
        }
        return copyhead;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章