Clone Graph
来源:互联网 发布:川大网络教育 编辑:程序博客网 时间:2024/05/22 02:18
updated: 06/10, 我们必须深刻理解什么是clone,不要将引用克隆
curNodeClone.neighbors.add(curNodeNeighborClone);加入的是clone,而不是现有的引用
典型的bfs遍历问题,基本功
很棒的代码点击打开链接
/** * @param node: A undirected graph node * @return: A undirected graph node */ public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if (node == null) { return null; } // 放原始node和其复制品 Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>(); // BFS用的queue List<UndirectedGraphNode> list = new LinkedList<UndirectedGraphNode>(); // 根节点的复制 UndirectedGraphNode nodeClone = new UndirectedGraphNode(node.label); // 把根节点和其复制品放入map map.put(node, nodeClone); //添加入队列 list.add(node); while (!list.isEmpty()) { // 当前处理对象 UndirectedGraphNode curNode = list.remove(0); // 得到当前原始对象的所有neighbor ArrayList<UndirectedGraphNode> curNodeNeighbors = curNode.neighbors; // 当前处理对象的复制品,必定在map里,因为在前面的neighbor里已经被创建 UndirectedGraphNode curNodeClone = map.get(curNode); for (UndirectedGraphNode curNodeNeighbor: curNodeNeighbors) { if (map.containsKey(curNodeNeighbor)) { //UndirectedGraphNode curNodeClone = map.get(curNode); // 之前已经被复制过的neighbor UndirectedGraphNode curNodeNeighborClone = map.get(curNodeNeighbor); // 就直接从map里取出neighborClone, 给curClone添加复制的neighbor curNodeClone.neighbors.add(curNodeNeighborClone); } else { // 如果该neighbor没有被复制过,则新建neighborClone UndirectedGraphNode curNodeNeighborClone = new UndirectedGraphNode(curNodeNeighbor.label); //UndirectedGraphNode curNodeClone = map.get(curNode); curNodeClone.neighbors.add(curNodeNeighborClone); // 并且添加到队列里为了将来的遍历 list.add(curNodeNeighbor); // 存储到map里 map.put(curNodeNeighbor, curNodeNeighborClone); } } } return nodeClone; }
0 0
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- Clone Graph
- UITableView使用详解及技巧大全
- 计算机网络必考点
- Android获取系统震动的调用
- 最佳优先搜索(Best-First Search)
- mysql索引优化
- Clone Graph
- 解决支付宝里面的 NSDataEx.m 里面的内存泄露
- python的yield和generator
- 如何安装体验 Ubuntu on Windows
- 斐波纳契数列
- 模板设计模式_组合&继承实现
- 【BZOJ1664】[Usaco2006 Open]County Fair Events 参加节日庆祝【线段覆盖】【贪心】
- android launchMode加载模式和intent flag
- sencha touch 模仿tabpanel导航栏TabBar的实现代码