Chapter 7: Miscellaneous

7.1 Copy / Clone Data Structure

e.g.1 LeetCode: Copy List With Random Pointer

def copyRandomList(self, head: 'Node') -> 'Node':
    randoms: Dict[Optional['Node'], Optional['Node']] = {}


    old_dummy, new_dummy = Node(0), Node(0)
    old_dummy.next, new_dummy.next = head, None
    old_prev, new_prev = old_dummy, new_dummy

    # copy the list except random pointers
    while old_prev.next:
        new_prev.next = Node(old_prev.next.val)
        old_prev = old_prev.next
        new_prev = new_prev.next
        randoms[old_prev] = new_prev
    
    old_node, new_node = old_dummy.next, new_dummy.next
    
    # all nodes created, just need random pointers filled
    while old_node:
        new_node.random = randoms[old_node.random] if old_node.random else None
        old_node = old_node.next
        new_node = new_node.next
    
    return new_dummy.next

e.g.2 LeetCode: Clone Graph

def cloneGraph(self, node: 'Node') -> 'Node':
    self.oldToNew: Dict['Node', 'Node'] = {}

    if node is None: return None
    if node in self.oldToNew: return self.oldToNew[node]

    new_node = Node(node.val)
    # store in hash before recursion as graph might circle back to this node
    self.oldToNew[node] = new_node 
    new_node.neighbors = [self.cloneGraph(n) for n in node.neighbors]
    return new_node

Last updated

Was this helpful?