**The generic solution for Clone Graph:**

*1. Clone nodes*

*2. Clone neighbors*

This question is similar as Clone Graph. The basic idea is pretty straight forward: travel from the head to the tail of the old linkedList, deep copying corresponding new nodes. The only trick is using a HashMap to save the pairing relationship between oldNode and newNode, so that we can get the corresponding pointer to the node's 'random' variable in the new list.

```
class CopyListwithRandomPointer: LeetcodeProtocol {
func copyRandomList(head: RandomListNode) -> RandomListNode {
var head: RandomListNode? = head
var map = [RandomListNode: RandomListNode]()// map: [oldNode: newNode]
var node: RandomListNode? = RandomListNode(head!.label)
map[head!] = node
let res = node!
let oldHead = head
while head?.next != nil { // 1-1. Traversal: head -> tail
node!.next = RandomListNode(head!.next!.label)
map[head!.next!] = node!.next // 1-2. map[oldNode] = newNode
head = head!.next!
node = node!.next!
}
// Copy random of new nodes from map
head = oldHead
node = res
while head != nil {// 2. Clone neighbors: clone `random` from map
if let oldRandom = head!.random {
node?.random = map[oldRandom]
}
node = node!.next
head = head!.next
}
return res
}
}
```