例如下面的图:
上面的图虽然有 5 个顶点,但是仅仅有顶点 2 连接顶点 1,如果用上面我们介绍过的邻接矩阵的方式来存储的话,就是:
上面的二维数组,仅仅只存储了一个 9,其他空间都浪费掉了。因此这里可以考虑使用邻接表的方式来存储。
邻接表核心思想
邻接表的核心思想是使用一个 一维数组 来存储所有的顶点,因此有多少个顶点,这个一维数组的长度就是多少。数组里面的每一项是一个 链表,链表会存储和该顶点连接的所有其他顶点。
我们还是来看一个具体的例子,假设还是下面的有向图:
那么使用数组存储的结构如下:
数组的每一项,是一个链表。这里以 V1 顶点为例。V1 指向了 V2 和 V4,V2 和 V4 这两个顶点在数组中的下标分别为 1
和 3,因此整个链表如蓝色部分所示。
注意这里 V2 和 V4 并不存在具体的顺序,因此在链表中的表现也可以是下标为 3 的顶点在前面,下标为 1 的顶点在后面。
因此,上面的有向图使用邻接表来存储的话,完整的邻接表为:
搞清楚了有向图后,无向图基本也是相同的道理,仅仅是链表的长度会更长一些,因为会包含出度和入度。例如下面的无向图:
使用邻接表的方式来存储的话,完整的数组结构如下图:
-EOF-