39 lines
703 B
Go
39 lines
703 B
Go
package q133
|
|
|
|
type Node struct {
|
|
Val int
|
|
Neighbors []*Node
|
|
}
|
|
|
|
func cloneGraph(node *Node) *Node {
|
|
if node == nil {
|
|
return nil
|
|
}
|
|
seen := map[*Node]*Node{}
|
|
|
|
queue := []*Node{node}
|
|
for ; len(queue) > 0; queue = queue[1:] {
|
|
cur := queue[0]
|
|
if _, ok := seen[cur]; ok {
|
|
continue
|
|
}
|
|
cloned := &Node{
|
|
Val: cur.Val,
|
|
Neighbors: []*Node{},
|
|
}
|
|
seen[cur] = cloned
|
|
for _, n := range cur.Neighbors {
|
|
if nCloned, ok := seen[n]; ok {
|
|
// Link
|
|
cloned.Neighbors = append(cloned.Neighbors, nCloned)
|
|
nCloned.Neighbors = append(nCloned.Neighbors, cloned)
|
|
} else {
|
|
// Add to queue
|
|
queue = append(queue, n)
|
|
}
|
|
}
|
|
}
|
|
return seen[node]
|
|
}
|
|
|
|
var _ = cloneGraph
|