是的你是对的,这是一个尴尬的选择。考虑改为使用
Map<V, Map<V, K>> adjacencies = new Hashmap<>();
邻近的节点 p 是 adjacencies.get(p).keyset() 和边缘的数据 p->q 是 adjacencies.get(p).get(q) 。
p
adjacencies.get(p).keyset()
p->q
adjacencies.get(p).get(q)
删除顶点 r 一定是一个棘手的操作因为你需要删除它的内外边缘 r 。但是,您可以通过维护并行的“反向邻接”列表来快速完成。
r
Map<V, Set<V>> reverseAdjacencies = new Hashmap<>();
每次添加邻接 p->q 有类似的东西:
Map<V, K> edgesFromP = adjacencies.get(); if (edgesFromP == null) { edgesFromP = new HashMap<>(); adjacencies.put(p, edgesFromP); } edgesFromP.put(q, nodeData);
反向地图也需要更新,例如
Set<V> edgesToQ = reverseAdjacencies.get(q); if (edgesToQ == null) { edgesToQ = new HashSet<>(); reverseAdjacencies.put(q, edgesToQ); } edgesToQ.add(p);
现在删除节点 r ,
// Remove the in-edges to r. for (V p : reverseAdjacencies.remove(r)) { adjacencies.get(p).remove(r); } // Remove r and all its out-edges adjacencies.remove(r);
我遗漏了像空检查这样的细节。