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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)

發布時間:2024/7/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

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

題目分析

題中每個節點新增了 random 指針,指向鏈表中的 任意節點 或者 空 。這個 random 指針就意味著在復制時,除了基礎的結點創建 ,還需要創建節點中的 pre.random指針及其指向的節點 。

本題難點

在復制鏈表的過程中構建新鏈表各節點的 random 引用指向。

解題

哈希映射

可以將原節點與新節點進行哈希映射,然后再查哈希表去構建每個節點的random指針。時間復雜度O(n) 空間復雜度O(n)

/*** Definition for a Node.* type Node struct {* Val int* Next *Node* Random *Node* }*/ // 哈希表映射 時間復雜度O(n) 空間復雜度O(n) func copyRandomList(head *Node) *Node {if head == nil {return head}// 新建鏈表,并將其與原鏈表結點映射nodeMap := make(map[*Node]*Node, 10)var newHead *Nodevar newCur *Nodecur := headfor cur != nil {node := new(Node)node.Val = cur.ValnodeMap[cur] = nodecur = cur.Nextif newCur == nil{newHead = nodenewCur = newHeadcontinue}newCur.Next = nodenewCur = newCur.Next}// 建立random關系cur = headnewCur = newHeadfor cur != nil {newCur.Random = nodeMap[cur.Random]newCur = newCur.Nextcur = cur.Next }return newHead }

衍生+拼接

可以先遍歷一遍初始鏈表,在每個節點后衍生一個新節點,在創建新鏈表時,新節點的random指向的就是原節點random所指結點后的衍生結點。
初始鏈表

衍生結點

拆分還原鏈表

  • 構建radom指向
  • 拆分并還原鏈表
  • 全部拆分并還原
  • 代碼實現

    /*** Definition for a Node.* type Node struct {* Val int* Next *Node* Random *Node* }*/// 拼裝+分解 func copyRandomList(head *Node) *Node {if head == nil {return head}// 拼接子節點,在源節點后衍生新節點cur := headfor cur != nil {node := new(Node)node.Val = cur.ValnextNode := cur.Nextnode.Next = nextNodecur.Next = nodecur = nextNode}// 建立新節點random指向cur = headfor cur != nil {nextNode := cur.Nextif cur.Random != nil {nextNode.Random = cur.Random.Next}cur = nextNode.Next}// 將子節點從原鏈表中分離cur = headvar newHead *Nodevar newCur *Nodefor cur != nil {nextNode := cur.Nextcur.Next = nextNode.Nextcur = cur.Nextif newCur == nil {newHead = nextNodenewCur = newHeadcontinue}newCur.Next = nextNodenewCur = newCur.Next}return newHead}

    總結

    以上是生活随笔為你收集整理的剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。