|
|
|
@ -57,11 +57,12 @@
|
|
|
|
|
=== "删除顶点"
|
|
|
|
|
![adjacency_list_remove_vertex](graph_operations.assets/adjacency_list_remove_vertex.png)
|
|
|
|
|
|
|
|
|
|
以下是基于邻接表实现图的代码示例。细心的同学可能注意到,**我们在邻接表中使用 `Vertex` 节点类来表示顶点**,而这样做是有原因的。
|
|
|
|
|
以下是邻接表的代码实现。对比上图,实际代码有以下不同。
|
|
|
|
|
|
|
|
|
|
1. 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。
|
|
|
|
|
2. 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 $i$ 的顶点,则需要遍历整个邻接表,将其中 $> i$ 的索引全部减 $1$ ,这样操作效率较低。
|
|
|
|
|
3. 因此我们考虑引入顶点类 `Vertex` ,使得每个顶点都是唯一的对象,此时删除顶点时就无须改动其余顶点了。
|
|
|
|
|
- 为了方便添加与删除顶点,以及简化代码,我们使用列表(动态数组)来代替链表。
|
|
|
|
|
- 使用哈希表来存储邻接表,`key` 为顶点实例,`value` 为该顶点的邻接顶点列表(链表)。
|
|
|
|
|
|
|
|
|
|
另外,我们在邻接表中使用 `Vertex` 类来表示顶点。这是因为如果与邻接矩阵一样用列表索引来区分不同顶点。那么假设想要删除索引为 $i$ 的顶点,则需要遍历整个邻接表,将所有大于 $i$ 的索引全部减 $1$ ,效率很低。而如果每个顶点都是唯一的 `Vertex` 实例,删除某一顶点之后就无须改动其他顶点了。
|
|
|
|
|
|
|
|
|
|
```src
|
|
|
|
|
[file]{graph_adjacency_list}-[class]{graph_adj_list}-[func]{}
|
|
|
|
|