国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表

這篇具有很好參考價(jià)值的文章主要介紹了【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

題目

【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表,力扣,# 中等題,leetcode,鏈表,算法

解題核心思路:找random指針指向

這里的拷貝屬于深拷貝,就是不光是拷貝值,還要拷貝其指針的引用情況。如果只是單獨(dú)的單向鏈表,則直接可以根據(jù)next指向找到下一個(gè)結(jié)點(diǎn),然后創(chuàng)建一個(gè)新節(jié)點(diǎn)復(fù)制過(guò)來(lái),直接拷貝,但是題目中的random指針指向的節(jié)點(diǎn)是沒(méi)有歸類的,這樣我們就不可能使用普通的循環(huán)來(lái)進(jìn)行拷貝,因?yàn)樵诳截惖臅r(shí)候,你只能找到next,但是random并不知道,可能拷貝的同時(shí)random都還沒(méi)創(chuàng)建出來(lái)

思路一:哈希

此題的復(fù)制,不單單要復(fù)制本身的.val值,還要把其next和random指向給復(fù)制過(guò)來(lái)。
那么我們可以借助一個(gè)哈希表Map來(lái)記錄下舊鏈表的映射關(guān)系,key為舊鏈表的節(jié)點(diǎn)(包含next和random指向),value為新建的新節(jié)點(diǎn)(val值直接copy舊鏈表的節(jié)點(diǎn))

【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表,力扣,# 中等題,leetcode,鏈表,算法

  1. 建立哈希表,key為舊鏈表的節(jié)點(diǎn),value為新建的新節(jié)點(diǎn)
  2. 然后去循環(huán)鏈表的同時(shí),根據(jù)key取出新節(jié)點(diǎn),并且(依據(jù)舊節(jié)點(diǎn))設(shè)置新節(jié)點(diǎn)的next和random
  3. 最后返回新鏈表的首節(jié)點(diǎn)map.get(head);
    【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表,力扣,# 中等題,leetcode,鏈表,算法

這里可以用純哈希+while或者 哈希+遞歸的方法,原理都是一樣的

思路二:迭代構(gòu)造新鏈表

給每個(gè)舊鏈表節(jié)點(diǎn)后面都連上一個(gè)自己的復(fù)制節(jié)點(diǎn),然后再根據(jù)老節(jié)點(diǎn)的random給后面的新節(jié)點(diǎn)附上,最后在把就新鏈表拆出來(lái)

  1. 構(gòu)建新老鏈表結(jié)合體
    【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表,力扣,# 中等題,leetcode,鏈表,算法

  2. 更新新節(jié)點(diǎn)的random
    【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表,力扣,# 中等題,leetcode,鏈表,算法

  3. 拆鏈
    【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表,力扣,# 中等題,leetcode,鏈表,算法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-684129.html

方法一:哈希+遞歸

 方法一 : 遞歸+哈希---->用哈希表記錄舊值和新值的映射,讓新值根據(jù)舊值的連接關(guān)系,構(gòu)建新鏈表
    Map<Node, Node> map = new HashMap<Node, Node>();
    public Node copyRandomList(Node head) {
        if(head==null) return null;

        if(!map.containsKey(head)){//如果map集合不含head  則創(chuàng)建一份新的head進(jìn)去  
         Node newHead = new Node(head.val);
         map.put(head,newHead);//key--->舊值  value--->新值   
         //給新值附上 next 和random
         newHead.next = copyRandomList(head.next);
         newHead.random = copyRandomList(head.random);
        }
        return map.get(head);
    }

方法二:純哈希

方法二: 純哈希----->  使用hash存儲(chǔ)原結(jié)點(diǎn)和克隆結(jié)點(diǎn)的映射關(guān)系,通過(guò)映射關(guān)系處理克隆結(jié)點(diǎn)的random指針
    public Node copyRandomList(Node head) {
        if(head==null) return head;

        // map方法,空間復(fù)雜度O(n)
        Node oldNode = head;
       // 使用hash表存儲(chǔ)舊結(jié)點(diǎn)和新結(jié)點(diǎn)的映射
        Map<Node,Node> map = new HashMap<>();
        while(oldNode != null){
            Node newNode = new Node(oldNode.val);
            map.put(oldNode,newNode);
            oldNode = oldNode.next;
        }

        oldNode = head;//重置 oldNode 位置到head頭結(jié)點(diǎn)
        while(oldNode != null){ //根據(jù)舊node 映射新node
        map.get(oldNode).next = map.get(oldNode.next);
        map.get(oldNode).random = map.get(oldNode.random);
        oldNode = oldNode.next;
        }
        return map.get(head);//返回頭結(jié)點(diǎn)的映射新節(jié)點(diǎn)
    }

方法三:迭代 + 節(jié)點(diǎn)拆分

/ 方法三: 迭代 + 節(jié)點(diǎn)拆分---->  給每一個(gè)舊的鏈表節(jié)點(diǎn)去拼接一個(gè)新的到舊節(jié)點(diǎn)后面,然后將新結(jié)點(diǎn)的random指向舊節(jié)點(diǎn)的random指向,最后再把新的節(jié)點(diǎn)拆分出來(lái)
public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }
        // for (Node node = head; node != null; node = node.next.next) {
        //     Node nodeNew = new Node(node.val);
        //     nodeNew.next = node.next;
        //     node.next = nodeNew;
        // }
        // 第一次遍歷,拼接新舊鏈表 舊1-->新1-->舊2--->新2
        Node node = head;
        while(node != null){
             Node nodeNew = new Node(node.val);
             nodeNew.next = node.next;
             node.next = nodeNew;
             node = node.next.next;
        }
        // for (Node node = head; node != null; node = node.next.next) {
        //     Node nodeNew = node.next;
        //     if(node.random != null) nodeNew.random = node.random.next;
        //     else nodeNew.random = null;
        // }
        // 第二次遍歷,給新結(jié)點(diǎn)連上舊節(jié)點(diǎn)的random
         node = head;// 重置node到head位置
        while(node != null){
            Node nodeNew = node.next;
            if(node.random != null) nodeNew.random = node.random.next; 
            //如果舊節(jié)點(diǎn)的random指向null  null本身沒(méi)有新節(jié)點(diǎn),則直接讓新節(jié)點(diǎn)的random指向null
            else nodeNew.random = null;
            node = node.next.next;
        }

        Node headNew = head.next;
        // for (Node node = head; node != null; node = node.next) {
        //     Node nodeNew = node.next;
        //     node.next = node.next.next;
        //     if(nodeNew.next != null) nodeNew.next = nodeNew.next.next;
        //     else nodeNew.next = null;
        // }
        node = head;// 重置node到head位置
        // 第三次遍歷,拆分新鏈表出來(lái)
        while(node != null){
            Node nodeNew = node.next;
            node.next = nodeNew.next;
            if(nodeNew.next != null) nodeNew.next = nodeNew.next.next;
            else nodeNew.next = null;//防止最后一個(gè)新鏈表nodeNew.next.next出現(xiàn)空指針
            node = node.next;
        }
        return headNew;
    }

到了這里,關(guān)于【LeetCode-中等題】138. 復(fù)制帶隨機(jī)指針的鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 138. 復(fù)制帶隨機(jī)指針的鏈表(深拷貝)題解

    138. 復(fù)制帶隨機(jī)指針的鏈表(深拷貝)題解

    給你一個(gè)長(zhǎng)度為? n ?的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針? random ?,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。 構(gòu)造這個(gè)鏈表的? 深拷貝 。?深拷貝應(yīng)該正好由? n ?個(gè)? 全新 ?節(jié)點(diǎn)組成,其中每個(gè)新節(jié)點(diǎn)的值都設(shè)為其對(duì)應(yīng)的原節(jié)點(diǎn)的值。新節(jié)點(diǎn)的? next ?指針和

    2024年02月13日
    瀏覽(90)
  • 力扣-復(fù)制帶隨機(jī)指針的鏈表

    給你一個(gè)長(zhǎng)度為? n ?的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針? random ?,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。 構(gòu)造這個(gè)鏈表的? 深拷貝 。?深拷貝應(yīng)該正好由? n ?個(gè)? 全新 ?節(jié)點(diǎn)組成,其中每個(gè)新節(jié)點(diǎn)的值都設(shè)為其對(duì)應(yīng)的原節(jié)點(diǎn)的值。新節(jié)點(diǎn)的? next ?指針和

    2024年02月11日
    瀏覽(83)
  • 單鏈表OJ題:LeetCode--138.復(fù)制帶隨即指針的鏈表

    單鏈表OJ題:LeetCode--138.復(fù)制帶隨即指針的鏈表

    朋友們、伙計(jì)們,我們又見(jiàn)面了,本期來(lái)給大家解讀一下LeetCode中第138道單鏈表OJ題,如果看完之后對(duì)你有一定的啟發(fā),那么請(qǐng)留下你的三連,祝大家心想事成! 數(shù)據(jù)結(jié)構(gòu)與算法專欄 : 數(shù)據(jù)結(jié)構(gòu)與算法 個(gè)? 人? 主? 頁(yè) ?: stackY、 C 語(yǔ) 言 專 欄 : C語(yǔ)言:從入門到精通 ?Lee

    2024年02月08日
    瀏覽(91)
  • 【LeetCode】 復(fù)制帶隨機(jī)指針的鏈表

    【LeetCode】 復(fù)制帶隨機(jī)指針的鏈表

    Leetcode 138.復(fù)制帶隨機(jī)指針的鏈表 給你一個(gè)長(zhǎng)度為 n 的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針 random ,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。 構(gòu)造這個(gè)鏈表的 深拷貝。 深拷貝應(yīng)該正好由 n 個(gè) 全新 節(jié)點(diǎn)組成,其中每個(gè)新節(jié)點(diǎn)的值都設(shè)為其對(duì)應(yīng)的原節(jié)點(diǎn)的值。新節(jié)

    2024年02月08日
    瀏覽(90)
  • 力扣每日一道系列 --- LeetCode 138. 隨機(jī)鏈表的復(fù)制

    力扣每日一道系列 --- LeetCode 138. 隨機(jī)鏈表的復(fù)制

    ?? 江池?。?個(gè)人主頁(yè) ??個(gè)人專欄: ?數(shù)據(jù)結(jié)構(gòu)探索 ?LeetCode每日一道 ?? 有航道的人,再渺小也不會(huì)迷途。 LeetCode 138. 隨機(jī)鏈表的復(fù)制 給你一個(gè)長(zhǎng)度為 n 的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針 random ,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。 構(gòu)造這個(gè)鏈表的

    2024年02月04日
    瀏覽(24)
  • Leetcode刷題之復(fù)制帶隨機(jī)指針的鏈表

    Leetcode刷題之復(fù)制帶隨機(jī)指針的鏈表

    生命不是安排,而是追求,人生的意義也許永遠(yuǎn)沒(méi)有答案,但也要盡情感受這種沒(méi)有答案的人生。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --弗吉尼亞.? 伍爾芙? ? ? ?? 目錄 前言:

    2024年02月04日
    瀏覽(90)
  • 【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(9)[復(fù)制帶隨機(jī)指針的鏈表]

    【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(9)[復(fù)制帶隨機(jī)指針的鏈表]

    所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型?? ?? 博主首頁(yè):初陽(yáng)785?? ?? 代碼托管:chuyang785?? ?? 感謝大家的支持,您的點(diǎn)贊和關(guān)注是對(duì)我最大的支持!??!?? ?? 博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文??!?? ?? 關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說(shuō)三遍?。。。?!

    2024年02月11日
    瀏覽(98)
  • 【數(shù)據(jù)結(jié)構(gòu)】LeetCode升級(jí)版的環(huán)形鏈表,復(fù)制帶隨機(jī)指針的鏈表

    【數(shù)據(jù)結(jié)構(gòu)】LeetCode升級(jí)版的環(huán)形鏈表,復(fù)制帶隨機(jī)指針的鏈表

    ? ? ? ? ? 1、題目說(shuō)明 ? ? ? ? ? 2、題目解析 ? ? ? ? ??1、題目說(shuō)明 ? ? ? ? ? 2、題目解析 ? ? ?1、題目說(shuō)明 題目鏈接: 升級(jí)版的環(huán)形鏈表? 給定一個(gè)鏈表的頭節(jié)點(diǎn) head ,返回鏈表開(kāi)始入環(huán)的第一個(gè)節(jié)點(diǎn)。? 如果鏈表無(wú)環(huán),則返回NULL。 如果鏈表中有某個(gè)節(jié)點(diǎn),可以通

    2024年01月16日
    瀏覽(102)
  • 【鏈表OJ 11】復(fù)制帶隨機(jī)指針的鏈表

    【鏈表OJ 11】復(fù)制帶隨機(jī)指針的鏈表

    前言:? ????個(gè)人主頁(yè):??????Dream_Chaser~????? ??刷題專欄:http://t.csdn.cn/UlvTc ??本篇內(nèi)容:力扣上鏈表OJ題目 目錄 leetcode138. 復(fù)制帶隨機(jī)指針的鏈表 1. 問(wèn)題描述 2.代碼思路: 2.1拷貝節(jié)點(diǎn)插入到原節(jié)點(diǎn)的后面 2.2控制拷貝節(jié)點(diǎn)的random???? 2.3拷貝節(jié)點(diǎn)解下來(lái)尾插組成拷

    2024年02月09日
    瀏覽(117)
  • 【數(shù)據(jù)結(jié)構(gòu)】?jī)蓛山粨Q鏈表 && 復(fù)制帶隨機(jī)指針的鏈表

    【數(shù)據(jù)結(jié)構(gòu)】?jī)蓛山粨Q鏈表 && 復(fù)制帶隨機(jī)指針的鏈表

    給你一個(gè)鏈表,兩兩交換其中相鄰的節(jié)點(diǎn),并返回交換后鏈表的頭節(jié)點(diǎn)。你必須在不修改節(jié)點(diǎn)內(nèi)部的值的情況下完成本題(即,只能進(jìn)行節(jié)點(diǎn)交換)。 使用一個(gè)棧S來(lái)存儲(chǔ)相鄰兩個(gè)節(jié)點(diǎn)即可 給你一個(gè)長(zhǎng)度為 n 的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針 random ,該指針可以

    2024年04月15日
    瀏覽(101)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包