Node* cloneGraph(Node* node) {
if (node == nullptr) return nullptr;
vector<Node*> all;
unordered_set<Node*> seen;
vector<Node*> stack = {node};
seen.insert(node);
while (!stack.empty()) {
Node* cur = stack.back(); stack.pop_back();
all.push_back(cur);
for (Node* nb : cur->neighbors) {
if (!seen.count(nb)) {
seen.insert(nb);
stack.push_back(nb);
}
}
}
unordered_map<Node*, Node*> copy;
for (Node* old : all) copy[old] = new Node(old->val);
for (Node* old : all) {
for (Node* nb : old->neighbors) copy[old]->neighbors.push_back(copy[nb]);
}
return copy[node];
}
public Node cloneGraph(Node node) {
if (node == null) return null;
List<Node> all = new ArrayList<>();
Set<Node> seen = new HashSet<>();
Deque<Node> stack = new ArrayDeque<>(); stack.push(node);
seen.add(node);
while (!stack.isEmpty()) {
Node cur = stack.pop();
all.add(cur);
for (Node nb : cur.neighbors) {
if (!seen.contains(nb)) {
seen.add(nb);
stack.push(nb);
}
}
}
Map<Node, Node> copy = new HashMap<>();
for (Node old : all) copy.put(old, new Node(old.val));
for (Node old : all) {
for (Node nb : old.neighbors) copy.get(old).neighbors.add(copy.get(nb));
}
return copy.get(node);
}
def clone_graph(node):
if node is None: return None
all_nodes = []
seen = set()
stack = [node]
seen.add(node)
while stack:
cur = stack.pop()
all_nodes.append(cur)
for nb in cur.neighbors:
if nb not in seen:
seen.add(nb)
stack.append(nb)
copy = {}
for old in all_nodes: copy[old] = Node(old.val)
for old in all_nodes:
for nb in old.neighbors: copy[old].neighbors.append(copy[nb])
return copy[node]
function cloneGraph(node: GraphNode | null): GraphNode | null {
if (node === null) return null;
const all: GraphNode[] = [];
const seen = new Set<GraphNode>();
const stack: GraphNode[] = [node];
seen.add(node);
while (stack.length > 0) {
const cur = stack.pop()!;
all.push(cur);
for (const nb of cur.neighbors) {
if (!seen.has(nb)) {
seen.add(nb);
stack.push(nb);
}
}
}
const copy = new Map<GraphNode, GraphNode>();
for (const old of all) copy.set(old, new GraphNode(old.val));
for (const old of all) {
for (const nb of old.neighbors) copy.get(old)!.neighbors.push(copy.get(nb)!);
}
return copy.get(node)!;
}
Node* cloneGraph(Node* node) {
if (node == nullptr) return nullptr;
unordered_map<Node*, Node*> copy; copy[node] = new Node(node->val);
queue<Node*> q; q.push(node);
while (!q.empty()) {
Node* cur = q.front(); q.pop();
for (Node* nb : cur->neighbors) {
if (!copy.count(nb)) {
copy[nb] = new Node(nb->val);
q.push(nb);
}
copy[cur]->neighbors.push_back(copy[nb]);
}
}
return copy[node];
}
public Node cloneGraph(Node node) {
if (node == null) return null;
Map<Node, Node> copy = new HashMap<>(); copy.put(node, new Node(node.val));
Queue<Node> queue = new ArrayDeque<>(); queue.add(node);
while (!queue.isEmpty()) {
Node cur = queue.poll();
for (Node nb : cur.neighbors) {
if (!copy.containsKey(nb)) {
copy.put(nb, new Node(nb.val));
queue.add(nb);
}
copy.get(cur).neighbors.add(copy.get(nb));
}
}
return copy.get(node);
}
def clone_graph(node):
if node is None: return None
copy = {node: Node(node.val)}
queue = deque([node])
while queue:
cur = queue.popleft()
for nb in cur.neighbors:
if nb not in copy:
copy[nb] = Node(nb.val)
queue.append(nb)
copy[cur].neighbors.append(copy[nb])
return copy[node]
function cloneGraph(node: GraphNode | null): GraphNode | null {
if (node === null) return null;
const copy = new Map<GraphNode, GraphNode>([[node, new GraphNode(node.val)]]);
const queue: GraphNode[] = [node];
while (queue.length > 0) {
const cur = queue.shift()!;
for (const nb of cur.neighbors) {
if (!copy.has(nb)) {
copy.set(nb, new GraphNode(nb.val));
queue.push(nb);
}
copy.get(cur)!.neighbors.push(copy.get(nb)!);
}
}
return copy.get(node)!;
}
Node* cloneGraph(Node* node) {
unordered_map<Node*, Node*> copy;
function<Node*(Node*)> dfs = [&](Node* cur) -> Node* {
auto existing = copy.find(cur);
if (existing != copy.end()) return existing->second;
Node* clone = new Node(cur->val);
copy[cur] = clone;
for (Node* nb : cur->neighbors) clone->neighbors.push_back(dfs(nb));
return clone;
};
return node == nullptr ? nullptr : dfs(node);
}
public Node cloneGraph(Node node) {
Map<Node, Node> copy = new HashMap<>();
return node == null ? null : dfs(node, copy);
}
private Node dfs(Node cur, Map<Node, Node> copy) {
Node existing = copy.get(cur);
if (existing != null) return existing;
Node clone = new Node(cur.val);
copy.put(cur, clone);
for (Node nb : cur.neighbors) clone.neighbors.add(dfs(nb, copy));
return clone;
}
def clone_graph(node):
copy = {}
def dfs(cur):
existing = copy.get(cur)
if existing is not None: return existing
clone = Node(cur.val)
copy[cur] = clone
for nb in cur.neighbors: clone.neighbors.append(dfs(nb))
return clone
return None if node is None else dfs(node)
function cloneGraph(node: GraphNode | null): GraphNode | null {
const copy = new Map<GraphNode, GraphNode>();
const dfs = (cur: GraphNode): GraphNode => {
const existing = copy.get(cur);
if (existing !== undefined) return existing;
const clone = new GraphNode(cur.val);
copy.set(cur, clone);
for (const nb of cur.neighbors) clone.neighbors.push(dfs(nb));
return clone;
};
return node === null ? null : dfs(node);
}
Node* cloneGraph(Node* node) {
if (node == nullptr) return nullptr;
vector<Node*> copies(101, nullptr);
Node* root = new Node(node->val);
copies[node->val] = root;
vector<Node*> stack = {node};
while (!stack.empty()) {
Node* cur = stack.back(); stack.pop_back();
Node* clone = copies[cur->val];
for (Node* nb : cur->neighbors) {
Node* nbClone = copies[nb->val];
if (nbClone == nullptr) {
nbClone = new Node(nb->val);
copies[nb->val] = nbClone;
stack.push_back(nb);
}
clone->neighbors.push_back(nbClone);
}
}
return root;
}
public Node cloneGraph(Node node) {
if (node == null) return null;
Node[] copies = new Node[101];
Node root = new Node(node.val);
copies[node.val] = root;
Deque<Node> stack = new ArrayDeque<>(); stack.push(node);
while (!stack.isEmpty()) {
Node cur = stack.pop();
Node clone = copies[cur.val];
for (Node nb : cur.neighbors) {
Node nbClone = copies[nb.val];
if (nbClone == null) {
nbClone = new Node(nb.val);
copies[nb.val] = nbClone;
stack.push(nb);
}
clone.neighbors.add(nbClone);
}
}
return root;
}
def clone_graph(node):
if node is None: return None
copies = [None] * 101
root = Node(node.val)
copies[node.val] = root
stack = [node]
while stack:
cur = stack.pop()
clone = copies[cur.val]
for nb in cur.neighbors:
nb_clone = copies[nb.val]
if nb_clone is None:
nb_clone = Node(nb.val)
copies[nb.val] = nb_clone
stack.append(nb)
clone.neighbors.append(nb_clone)
return root
function cloneGraph(node: GraphNode | null): GraphNode | null {
if (node === null) return null;
const copies: (GraphNode | undefined)[] = new Array(101);
const root = new GraphNode(node.val);
copies[node.val] = root;
const stack: GraphNode[] = [node];
while (stack.length > 0) {
const cur = stack.pop()!;
const clone = copies[cur.val]!;
for (const nb of cur.neighbors) {
let nbClone = copies[nb.val];
if (nbClone === undefined) {
nbClone = new GraphNode(nb.val);
copies[nb.val] = nbClone;
stack.push(nb);
}
clone.neighbors.push(nbClone);
}
}
return root;
}