```
class Solution(object):
def copyRandomList(self, head):
"""
:type head: RandomListNode
:rtype: RandomListNode
"""
# use DFS to visit the graph
# DFS info must be stored within visited
# here visited is the nodeMap
self.nodeMap = {}
return self.DFS(head)
def DFS(self, node):
if not node: return None
if node not in self.nodeMap: # visited
self.nodeMap[node] = RandomListNode(node.label)
self.nodeMap[node].next = self.DFS(node.next)
self.nodeMap[node].random = self.DFS(node.random)
return self.nodeMap[node]
```