package main
/*
type RandomListNode struct {
Label int
Next *RandomListNode
Random *RandomListNode
}
*/
/**
*
* @param pHead RandomListNode类
* @return RandomListNode类
*/
func Clone( head *RandomListNode ) *RandomListNode {
//write your code here
// 0. 特殊条件判断
if head == nil {
return nil
}
// 1. 一边遍历创建一个新的链表,一边保存新节点与旧节点的映射
// 2. 再次遍历,将新节点的 random 指针连接到与旧节点映射的新节点上
head1 := head
newHead := &RandomListNode{Label: head1.Label}
head2 := newHead
m := map[*RandomListNode]*RandomListNode{}
m[head1] = head2
// 创建新链表,链接 next
for head1.Next != nil {
head2.Next = &RandomListNode{Label: head1.Next.Label}
head1 = head1.Next
head2 = head2.Next
m[head1] = head2
}
// 链接 random
head1, head2 = head, newHead
for head1 != nil {
head2.Random = m[head1.Random]
head1 = head1.Next
head2 = head2.Next
}
return newHead
}