Clone Graph

LeetCode 133 · View on LeetCode

DFS with a hash map to deep-copy a graph. The map tracks original-to-clone mappings to avoid revisiting.

package main

import "fmt"

type Node struct {
	Val       int
	Neighbors []*Node
}

func cloneGraph(node *Node) *Node {
	if node == nil {
		return nil
	}
	cloned := map[int]*Node{}

	var dfs func(*Node) *Node
	dfs = func(n *Node) *Node {
		if c, ok := cloned[n.Val]; ok {
			return c
		}
		copy := &Node{Val: n.Val}
		cloned[n.Val] = copy
		for _, nb := range n.Neighbors {
			copy.Neighbors = append(copy.Neighbors, dfs(nb))
		}
		return copy
	}
	return dfs(node)
}

func main() {
	// Build: 1 -- 2 -- 3 -- 1
	n1 := &Node{Val: 1}
	n2 := &Node{Val: 2}
	n3 := &Node{Val: 3}
	n1.Neighbors = []*Node{n2, n3}
	n2.Neighbors = []*Node{n1, n3}
	n3.Neighbors = []*Node{n1, n2}

	clone := cloneGraph(n1)
	fmt.Println(clone.Val, len(clone.Neighbors))             // 1 2
	fmt.Println(clone.Neighbors[0].Val)                       // 2
	fmt.Println(clone != n1, clone.Neighbors[0] != n2)        // true true
}
▶ Open Go Playground

Copy the code above and paste to run

© 2026 ByteLearn.dev. Free courses for developers. · Privacy