日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hashmap 复制_复杂链表的复制

發(fā)布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hashmap 复制_复杂链表的复制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述

輸入一個復(fù)雜鏈表(每個節(jié)點中有節(jié)點值,以及兩個指針,一個指向下一個節(jié)點,另一個特殊指針指向任意一個節(jié)點),返回結(jié)果為復(fù)制鏈表的head。(注意,輸出結(jié)果中請不要返回參數(shù)中的節(jié)點引用,否則判斷程序會直接返回空)

兩種策略解決

策略1(HashMap解決)

  • 先用一個HashMap的key存放原來的鏈表,value存放key的值。
  • 知道了key的指向,然后讓value跟著key一樣的指向即可。
  • 代碼

    import java.util.HashMap;/*** @author god-jiang* @date 2020/1/16 18:48*/ public class RandomListNodeCopy {//定義復(fù)雜鏈表的結(jié)構(gòu)public class RandomListNode {int label;RandomListNode next = null;RandomListNode random = null;RandomListNode(int label) {this.label = label;}}public RandomListNode Clone(RandomListNode pHead) {HashMap<RandomListNode, RandomListNode> map = new HashMap<>();RandomListNode cur = pHead;while (cur != null) {map.put(cur, new RandomListNode(cur.label));cur = cur.next;}cur = pHead;while (cur != null) {map.get(cur).next = map.get(cur.next);map.get(cur).random = map.get(cur.random);cur = cur.next;}return map.get(pHead);} }

    通過截圖

    HashMap解法總結(jié)

    用HashMap做簡單,容易理解,時間復(fù)雜度為O(N),空間復(fù)雜度也為O(N),其實這道題還可以做到時間復(fù)雜度為O(N),空間復(fù)雜度為O(1),就是我接下來介紹的這種解法。

    策略2(創(chuàng)建拆分)

  • 遍歷鏈表,復(fù)制每個節(jié)點,如復(fù)制節(jié)點A得到A1,將節(jié)點A1插到節(jié)點A后面
  • 重新遍歷鏈表,復(fù)制舊節(jié)點的隨機指針給新節(jié)點,如A1.random = A.random.next
  • 拆分鏈表,將鏈表拆分為原鏈表和復(fù)制后的鏈表
  • 圖解

    代碼

    import java.util.HashMap;/*** @author god-jiang* @date 2020/1/16 18:48*/ public class RandomListNodeCopy {//定義復(fù)雜鏈表的結(jié)構(gòu)public class RandomListNode {int label;RandomListNode next = null;RandomListNode random = null;RandomListNode(int label) {this.label = label;}}//合并拆分的時間復(fù)雜度為O(N),空間復(fù)雜度為O(1)public RandomListNode Clone(RandomListNode pHead) {if (pHead == null) {return null;}RandomListNode cur = pHead;//1、復(fù)制每個結(jié)點,如復(fù)制結(jié)點A得到A1,將結(jié)點A1插到結(jié)點A后面;while (cur != null) {RandomListNode cloneNode = new RandomListNode(cur.label);RandomListNode nextNode = cur.next;cur.next = cloneNode;cloneNode.next = nextNode;cur = nextNode;}cur = pHead;//2、重新遍歷鏈表,復(fù)制老結(jié)點的隨機指針給新結(jié)點,如A1.random = A.random.next;while (cur != null) {cur.next.random = cur.random == null ? null : cur.random.next;cur = cur.next.next;}//3、拆分鏈表,將鏈表拆分為原鏈表和復(fù)制后的鏈表cur = pHead;RandomListNode pCloneHead = pHead.next;while (cur != null) {RandomListNode cloneNode = cur.next;cur.next = cloneNode.next;cloneNode.next = cloneNode.next == null ? null : cloneNode.next.next;cur = cur.next;}return pCloneHead;} }

    通過截圖

    總結(jié)

    一道好的題目往往有多種解決的辦法,大二時期的我就只會用最基礎(chǔ)的貪心和暴力解決各類問題,不是說暴力解法不好,只是有時候有更好的算法可以解決我們又為何不去掌握呢。所以一道題目的多種的解法我都會好好研讀和學(xué)習(xí)。希望也有人喜歡和我一樣多了解多種解法,擴展一下自己的思路,嘿嘿嘿。。。

    PS:如果覺得博主寫的不錯的話可以點點贊,關(guān)注走一波,謝謝大家的支持了~~~

    總結(jié)

    以上是生活随笔為你收集整理的hashmap 复制_复杂链表的复制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。