LeetCode138:ランダムポインタでリンクリストをコピーする

1.タイトルの説明

    リンクリストを指定すると、各ノードには追加のランダムポインターが含まれ、リンクリスト内の任意のノードまたは空のノードを指すことができます。

    このリンクリストのディープコピーを返すように要求します。

    n個のノードで構成されるリンクリストを使用して、入力/出力のリンクリストを表します。各ノードは[val、random_index]で表されます。

  • val:Node.valを表す整数。
  • random_index:ランダムポインタが指すノードのインデックス(0からn-1の範囲)。どのノードも指していない場合はnullです。

例1:

ここに画像の説明を挿入
入力:head = [[7、null]、[13,0]、[11,4]、[10,2]、[1,0]]
出力:[[7、null]、[13,0]、 [11,4]、[10,2]、[1,0]]

例2:

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-SIpev3DP-1607850859994)(C:\ Users \ admin \ AppData \ Roaming \ Typora \ typora-user-images \ image-20201213164032257.png)]
入力:head = [[1,1]、[2,1]]
出力:[[1,1]、[2,1]]

例3:

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-mGDH2LdA-1607850859996)(C:\ Users \ admin \ AppData \ Roaming \ Typora \ typora-user-images \ image-20201213164059316.png)]
入力:head = [[3、null]、[3,0]、[3、null]]
出力:[[3、null]、[3,0]、[3、null]]

例4:

入力:head = []
出力:[]
説明:指定されたリンクリストは空(nullポインター)であるため、nullが返されます。

促す:

  • -10000 <= Node.val <= 10000
  • Node.randomが空(null)であるか、リンクリスト内のノードを指しています。
  • ノードの数は1000を超えません。
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
    
    
public:
    Node* copyRandomList(Node* head) {
    
    
        //to do
    }
};

2つの問題解決のアイデア

  1. ハッシュグラフを使用して、最初に元のリンクリストと同じ数のノードを生成します

    	unordered_map<Node*,Node*>nodemap;
        nodemap[nullptr]=nullptr;
        Node* p=head;
        while(p){
          
          
            nodemap[p]=new Node(p->val);
            p=p->next;
        }
    
  2. ハッシュグラフの各ノードを元のノードと同じにします

     	p=head;
        while(p!=nullptr){
          
          
            nodemap[p]->next=nodemap[p->next];
            p=p->next;
        }
    
  3. ランダムポインタをコピーする

         p=head;
         while(p!=nullptr){
          
          
             nodemap[p]->random=nodemap[p->random];
             p=p->next;
         }
    

三、私のコード

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
    
    
public:
    Node* copyRandomList(Node* head) {
    
    
        unordered_map<Node*,Node*>nodemap;
        nodemap[nullptr]=nullptr;
        Node* p=head;
        while(p!=nullptr){
    
    
            nodemap[p]=new Node(p->val);
            p=p->next;
        }
        p=head;
        while(p!=nullptr){
    
    
            nodemap[p]->next=nodemap[p->next];
            p=p->next;
        }
        p=head;
        while(p!=nullptr){
    
    
            nodemap[p]->random=nodemap[p->random];
            p=p->next;
        }
        return nodemap[head];
    }
};

[外部リンクの画像転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-uHfWeneQ-1607850860001)(C:\ Users \ admin \ AppData \ Roaming \ Typora \ typora-user-images \ image-20201213171243482.png)]

おすすめ

転載: blog.csdn.net/weixin_45341339/article/details/111134065