
代码:
- 如题,给你所用指针,让你将这些指针指向的地址再复制一份
- 所以,遍历所有的指针,将遍历到的指针全都分配一份新的地址
- visited哈希用来记录当前指针我们是否已经分配过地址了
- cg函数传入指针,输出分配好地址的指针
- 如果哈希表中存在这个指针,说明已经分配过了,直接返回就可以了,防止重复分配内存
- 克隆当前节点,因为当前节点的Neighbors中的指针我们还未分配内存,故而不能直接在克隆的时候直接将邻居也克隆进去
- 当前节点分配内存后,哈希表记一下
- 遍历该节点的邻居并更新克隆节点的邻居列表
- 返回克隆节点
func cloneGraph(node *Node) *Node {
visited := map[*Node]*Node{}
var cg func(node *Node) *Node
cg = func(node *Node) *Node {
if node == nil {
return node
}
if _, ok := visited[node]; ok {
return visited[node]
}
cloneNode := &Node{node.Val, []*Node{}}
visited[node] = cloneNode
for _, n := range node.Neighbors {
cloneNode.Neighbors = append(cloneNode.Neighbors, cg(n))
}
return cloneNode
}
return cg(node)
}