题目链接:https://leetcode.com/problems/copy-list-with-random-pointer/
这道题目比较经典,头条等多个大厂都考过,《剑指offer》中也有。
基础解法
创建新链表,先拷贝基础信息,再拷贝random指针。
func copyRandomList(head *Node) *Node {
p := head
var dummyHead Node
pHead := &dummyHead
// 存储新旧节点的映射
mp := make(map[*Node]*Node)
for p != nil {
newNode := &Node{
Val: p.Val,
}
mp[p] = newNode
pHead.Next = newNode
pHead = pHead.Next
p = p.Next
}
// 开始copy random指针
p = head
pHead = dummyHead.Next
for p != nil {
if p.Random != nil {
pHead.Random = mp[p.Random]
}
pHead = pHead.Next
p = p.Next
}
return dummyHead.Next
}
高级解法
新节点直接放在旧节点之后,设置完random指针之后, 再拆分链表。
func copyRandomList(head *Node) *Node {
// clone 节点
p := head
for p != nil {
pClone := &Node{
Val: p.Val,
Next: p.Next,
}
p.Next = pClone
p = pClone.Next
}
// clone random 指针
p = head
for p != nil {
pClone := p.Next
if p.Random != nil {
pClone.Random = p.Random.Next
}
p = pClone.Next
}
// 拆分链表
p = head
var dummyHead Node
pHead := &dummyHead
for p != nil {
pClone := p.Next
pHead.Next = pClone
pHead = pHead.Next
p.Next = pClone.Next
p = p.Next
}
return dummyHead.Next
}