Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions leet-code/133-clone-graph/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 133-clone-graph
Given a reference of a node in a connected undirected graph.

Return a deep copy (clone) of the graph.

Each node in the graph contains a value (int) and a list (List[Node]) of its neighbors.

class Node {
public int val;
public List<Node> neighbors;
}


Test case format:

For simplicity, each node's value is the same as the node's index (1-indexed). For example, the first node with val == 1, the second node with val == 2, and so on. The graph is represented in the test case using an adjacency list.

An adjacency list is a collection of unordered lists used to represent a finite graph. Each list describes the set of neighbors of a node in the graph.

The given node will always be the first node with val = 1. You must return the copy of the given node as a reference to the cloned graph.

Input: adjList = [[2,4],[1,3],[2,4],[1,3]]
Output: [[2,4],[1,3],[2,4],[1,3]]
Explanation: There are 4 nodes in the graph.
1st node (val = 1)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
2nd node (val = 2)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
3rd node (val = 3)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
4th node (val = 4)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
41 changes: 41 additions & 0 deletions leet-code/133-clone-graph/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* // Definition for a _Node.
* function _Node(val, neighbors) {
* this.val = val === undefined ? 0 : val;
* this.neighbors = neighbors === undefined ? [] : neighbors;
* };
*/

/**
* @param {_Node} node
* @return {_Node}
*/
var cloneGraph = function(node) {
// handle edge case
if (node === null) return node
// keep track of the node to return
const start = new Node(node.val)
// manage cycle detection by keeping track of which nodes have been visited
const map= new Map();
// seed the map with the start node
map.set(node, start)
// keep track of nodes to visit
const stack = [node];
// exhaust the stack
while (stack.length > 0) {
const next = stack.pop();
// consider each neighbor
for (const neighbor of next.neighbors) {
// identify nodes that have never been visited
if (!map.has(neighbor)) {
// record the node as visited
map.set(neighbor, new Node(neighbor.val))
// schedule the node to be visited
stack.push(neighbor)
}
// update the cloned node's neighbors
map.get(next).neighbors.push(map.get(neighbor))
}
}
return start;
};