1. /*
  2. Definition for a Node.
  3. class Node {
  4.   public int val;
  5.   public List<Node> neighbors;
  6.   public Node() {
  7.   val = 0;
  8.   neighbors = new ArrayList<Node>();
  9.   }
  10.   public Node(int _val) {
  11.   val = _val;
  12.   neighbors = new ArrayList<Node>();
  13.   }
  14.   public Node(int _val, ArrayList<Node> _neighbors) {
  15.   val = _val;
  16.   neighbors = _neighbors;
  17.   }
  18. }
  19. */
  20.  
  21. class Solution {
  22. public Node cloneGraph(Node node) {
  23. // Create a map to store original nodes -> cloned nodes.
  24. Map<Node, Node> clonedMap = new HashMap<>();
  25.  
  26. return dfs(node, clonedMap);
  27. }
  28.  
  29. public Node dfs(Node node, Map<Node, Node> clonedMap)
  30. {
  31. if(node == null)
  32. return null;
  33.  
  34. if(clonedMap.containsKey(node))
  35. return clonedMap.get(node);
  36.  
  37. // Create a new node with the same value.
  38. Node newNode = new Node(node.val);
  39. // Store it in the map.
  40. clonedMap.put(node, newNode);
  41.  
  42. for(Node u : node.neighbors)
  43. {
  44. // Recursively clone all neighbors and add them to the clone’s neighbor list.
  45. Node nextNode = dfs(u, clonedMap);
  46. newNode.neighbors.add(nextNode);
  47. }
  48. return newNode;
  49. }
  50. }