克隆图——copy

96 阅读1分钟

image.png

代码:

  1. 如题,给你所用指针,让你将这些指针指向的地址再复制一份
  2. 所以,遍历所有的指针,将遍历到的指针全都分配一份新的地址
  3. visited哈希用来记录当前指针我们是否已经分配过地址了
  4. cg函数传入指针,输出分配好地址的指针
  5. 如果哈希表中存在这个指针,说明已经分配过了,直接返回就可以了,防止重复分配内存
  6. 克隆当前节点,因为当前节点的Neighbors中的指针我们还未分配内存,故而不能直接在克隆的时候直接将邻居也克隆进去
  7. 当前节点分配内存后,哈希表记一下
  8. 遍历该节点的邻居并更新克隆节点的邻居列表
  9. 返回克隆节点
/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Neighbors []*Node
 * }
 */

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)
}