48 lines
709 B
Go
48 lines
709 B
Go
package top100liked
|
|
|
|
// https://leetcode.cn/problems/copy-list-with-random-pointer/?envType=study-plan-v2&envId=top-100-liked
|
|
|
|
type Node struct {
|
|
Val int
|
|
Next *Node
|
|
Random *Node
|
|
}
|
|
|
|
func copyRandomList(head *Node) *Node {
|
|
if head == nil {
|
|
return nil
|
|
}
|
|
|
|
m := make(map[*Node]*Node)
|
|
cur := head
|
|
|
|
var first *Node
|
|
|
|
// 新旧节点映射
|
|
for cur != nil {
|
|
newNode := &Node{
|
|
Val: cur.Val,
|
|
Next: nil,
|
|
Random: nil,
|
|
}
|
|
if first == nil {
|
|
first = newNode
|
|
}
|
|
m[cur] = newNode
|
|
cur = cur.Next
|
|
}
|
|
|
|
cur = head
|
|
for cur != nil {
|
|
if cur.Next != nil {
|
|
m[cur].Next = m[cur.Next]
|
|
}
|
|
if cur.Random != nil {
|
|
m[cur].Random = m[cur.Random]
|
|
}
|
|
cur = cur.Next
|
|
}
|
|
|
|
return first
|
|
}
|