Article start
DSA Course: Interview Patterns and Problem Solving
Module 7: Graphs

Clone Graph: Hash Map DFS Pattern

Deep-copy a graph while preserving neighbor links and cycles.

May 29, 2026·25

Learning Outcome

After this lesson, you should be able to use a map from original nodes to clone nodes so cycles do not create duplicate copies.

Problem Statement

Given a reference to a node in a connected undirected graph, return a deep copy of the graph.

InputOutputWhy
adjList = [[2,4],[1,3],[2,4],[1,3]]A separate graph with the same values and neighbor linksEach original node has exactly one clone, and cloned neighbors point to cloned nodes.

Brute Force Approach

Create a new node every time a neighbor is seen. In cyclic graphs this duplicates nodes and can recurse forever.

Optimized Approach

DFS from the start node. Store each original node in a map as soon as its clone is created, then recursively clone neighbors.

Exact Pseudocode

clone(node):
  if node is null:
    return null
  if node exists in map:
    return map[node]
  copy = new Node(node.val)
  map[node] = copy
  for neighbor in node.neighbors:
    copy.neighbors.add(clone(neighbor))
  return copy

Reference Code

class Solution:
    def cloneGraph(self, node):
        clones = {}

        def dfs(cur):
            if not cur:
                return None
            if cur in clones:
                return clones[cur]

            copy = Node(cur.val)
            clones[cur] = copy
            for nei in cur.neighbors:
                copy.neighbors.append(dfs(nei))
            return copy

        return dfs(node)

Sample Dry Run

StepStateResult
Visit node 1Create clone 1 and store map[1]Cycle protection starts
Clone neighbor 2Create clone 2Add it to clone 1 neighbors
Neighbor points backDFS sees node 1 already in mapReuse clone 1
FinishEvery original maps to one cloneReturn clone of start

Complexity

MeasureValueReason
TimeO(v + e)Every node and neighbor edge is visited once.
SpaceO(v)The clone map and recursion stack store graph nodes.

Edge Cases

  • Null input should return null.
  • Cycles must reuse existing clones.
  • Do not share original neighbor references in the clone.

Interview Checklist

  • Put the clone in the map before cloning neighbors.
  • Use node references as map keys.
  • Return the cloned start node, not the original node.

FAQs

Why store clone before neighbors?

A cycle can point back to the current node. The map must already know the clone to stop infinite recursion.

Is this a deep copy?

Yes, every node is new, and every neighbor link points to cloned nodes.

What is the core pattern?

DFS with an original-to-copy hash map.

Test your knowledge

Take a quick quiz based on this chapter.

Discussion

0 comments

Sign in to share a question or add to the discussion.
Start the discussion

Ask a question or share what stood out to you.