Note

I can still refactor my code. Can also solve via recursion DFS

"""
# Definition for a Node.
class Node:
    def __init__(self, val = 0, neighbors = None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []
"""
 
class Solution:
    def cloneGraph(self, node: 'Node') -> 'Node':
        if not node:
            return None
        
        seenNodes = [None for _ in range(1, 102)]
 
        stack = [node]
        seen = set()
 
        while stack:
            for _ in range(len(stack)):
                v = stack.pop()
                seen.add(v)
 
                if seenNodes[v.val] is None:
                    seenNodes[v.val] = Node(v.val)
 
                for neighbor in v.neighbors:
                    if seenNodes[neighbor.val] is None:
                        seenNodes[neighbor.val] = Node(neighbor.val)
 
                    seenNodes[v.val].neighbors.append(seenNodes[neighbor.val])
                    if neighbor not in seen:
                        stack.append(neighbor)
                        seen.add(neighbor)
        
        return seenNodes[node.val]
 

References

https://leetcode.com/problems/clone-graph/