日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言復雜鏈表的復制實例詳解_C 語言

作者:愛你哦小豬豬 ? 更新時間: 2022-04-23 編程語言

一、題目描述

請實現 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 。

二、思路分析

注:思路分析中的一些內容和圖片參考自力扣各位前輩的題解,感謝他們的無私奉獻

分析

復制普通鏈表:給定鏈表的頭結點head,復制普通鏈表很簡單,只需遍歷鏈表,每輪需要:建立新結點 + 讓前驅結點的next指向當前這個新結點 + 讓當前這個新結點的next指向空

復制復雜鏈表:本題鏈表的結點新增了 random 指針,指向鏈表中的任意結點或者null。這個 random 指針意味著在復制過程中,除了構建前驅結點的next指針,還要構建前驅結點的ramdom指針。因此,每輪需要:建立2個新結點 + 讓前驅結點的next指向第1個新結點 + 讓前驅結點的random指向第2個新結點。但是這有一個問題:并不是每次都需要建立2個新結點。有時候前驅結點的random指向的是已經存在的結點,但是如何判斷出來呢?如果把所有結點遍歷一遍,那就太麻煩了。

思路

利用哈希表的查詢特點,考慮構建原鏈表結點和新鏈表對應結點的鍵值對映射關系,再遍歷構建新鏈表各結點的next和random引用指向即可。
?

算法流程:

①若頭節點head為空結點,直接返回NULL?;

②初始化:聲明一個哈希表dic,定義一個結點cur指向頭結點,這個cur控制后面的循環

③建立哈希映射:遍歷這個鏈表,每個鏈表結點對應建立一個新結點,并向dic添加鍵值對(原cur結點, 新cur結點)

④構建新鏈表的引用指向:構建新結點的nextrandom引用指向

⑤返回值: 返回新鏈表的頭結點,即dic[cur]

在這里插入圖片描述

三、整體代碼

/*
// 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) {
        //若是空鏈表,則返回NULL
        if(head == NULL) return NULL;
        //創建一個結點,指向這個鏈表的頭結點。這個結點用來控制后面的循環
        Node* cur = head; 
        //創建一個哈希表
        unordered_map<Node*, Node*> map;
        while(cur != NULL){
            //為鏈表每個結點創建一個對應的新結點,并建立原結點和新結點的Map映射
            map[cur] = new Node(cur->val);
            cur = cur->next;
        }
        cur = head;
        //為新鏈表每個結點的next和random設置對應的指向
        while(cur != NULL){
            map[cur]->next = map[cur->next];
            map[cur]->random = map[cur->random];
            cur = cur->next;
        }
        //返回新鏈表的頭結點
        return map[head];
    }
};

在這里插入圖片描述

總結

原文鏈接:https://blog.csdn.net/InnerPeaceHQ/article/details/122971715

欄目分類
最近更新