Clone Graph

LeetCode 133 · View on LeetCode

DFS with a hash map to track already-cloned nodes. For each node, create its clone, then recursively clone all neighbors.

class Node:
    def __init__(self, val=0, neighbors=None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []

def clone_graph(node: Node | None) -> Node | None:
    if not node:
        return None
    cloned = {}

    def dfs(n: Node) -> Node:
        if n in cloned:
            return cloned[n]
        copy = Node(n.val)
        cloned[n] = copy
        copy.neighbors = [dfs(nb) for nb in n.neighbors]
        return copy

    return dfs(node)

if __name__ == '__main__':
    # Build graph: 1 -- 2 -- 3 -- 4 -- 1
    n1, n2, n3, n4 = Node(1), Node(2), Node(3), Node(4)
    n1.neighbors = [n2, n4]
    n2.neighbors = [n1, n3]
    n3.neighbors = [n2, n4]
    n4.neighbors = [n3, n1]

    clone = clone_graph(n1)
    print(clone.val)                                  # 1
    print([n.val for n in clone.neighbors])           # [2, 4]
    print(clone is not n1)                            # True
    print(clone.neighbors[0] is not n2)               # True
© 2026 ByteLearn.dev. Free courses for developers. · Privacy