图最常见的两种存储方式是邻接表和邻接矩阵。
链式前向星其实就是静态建立的邻接表,时间效率为 O(n),空间效率也为 O(n)。遍历效率也为 O(n)。
一、邻接表
邻接表存储方式适合存储边稀疏的图,判断两点之间是否有边不方便;
邻接矩阵适合存储边稠密的,判断边和权值都很方便。
邻接表的逻辑结构:
主要有两个部分组成:
1)顶点数组;
2)顶点所邻的边形成的链表【所以叫“邻接表” = 邻接点链表 + 节点表】。
存储链表的方式有两种:
1)若不知道边的数量范围,使用 node + next 指针的经典链表方式;
2)若知道边数量的范围,可以使用数组来代替链表存储。【因为边的数量是有限的,我们只要保证一条边占据数组一个位置,即给边一个唯一的编号,那么边就能用这个唯一的下标来表示一条边】。
数组相较于链表,符合局部性原理,缓存预读的概率更高,往往具有更高的效率。所以优先选择方式2)。
采用数组+数组链表的方式来存储图的邻接表的物理结构叫做链式前向星。
二、链式前向星
head 数组:记录i节点的编号最大的邻边存储在 next 中的下标;
next 数组:以数组式链表的形式存储所有边的编号【可能还有其他信息】
这时候,按照 next 数组的存