1. 程式人生 > >Leetcode 133.克隆圖

Leetcode 133.克隆圖

克隆圖

克隆一張無向圖,圖中的每個節點包含一個 label (標籤)和一個 neighbors (鄰接點)列表 。

OJ的無向圖序列化:

節點被唯一標記。

我們用 # 作為每個節點的分隔符,用 , 作為節點標籤和鄰接點的分隔符。

例如,序列化無向圖 {0,1,2#1,2#2,2}。

該圖總共有三個節點, 被兩個分隔符  # 分為三部分。 

  1. 第一個節點的標籤為 0,存在從節點 0 到節點 1 和節點 2 的兩條邊。
  2. 第二個節點的標籤為 1,存在從節點 1 到節點 2 的一條邊。
  3. 第三個節點的標籤為 2,存在從節點 2 到節點 2 (本身) 的一條邊,從而形成自環。

我們將圖形視覺化如下:

1

/ \

/ \

0 --- 2

/ \

\_/

 

 1 public class Solution {
 2     public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
 3         if(node==null)
 4             return null;
 5         Queue<UndirectedGraphNode> q=new
LinkedList<UndirectedGraphNode>(); 6 HashMap<UndirectedGraphNode,UndirectedGraphNode> hash=new HashMap<UndirectedGraphNode,UndirectedGraphNode>(); 7 UndirectedGraphNode graph=new UndirectedGraphNode(node.label); 8 q.add(node); 9 hash.put(node,graph);
10 while(!q.isEmpty()){ 11 UndirectedGraphNode curNode=q.poll(); 12 List<UndirectedGraphNode> currNeighbos=curNode.neighbors; 13 for(UndirectedGraphNode myNode: currNeighbos){ 14 if(!hash.containsKey(myNode)){ 15 UndirectedGraphNode copy=new UndirectedGraphNode(myNode.label); 16 hash.put(myNode,copy); 17 hash.get(curNode).neighbors.add(copy); 18 q.add(myNode); 19 }else{ 20 hash.get(curNode).neighbors.add(hash.get(myNode)); 21 } 22 } 23 } 24 return graph; 25 } 26 27 }