我知道我也许正在从死里复生一个老问题,但是我觉得应该发表评论.
您可以创建关联列表图形结构,也可以针对图进行调整.
考虑LinkedList< Vertex>.对象和LinkedList< Edge>.宾语.这将使您可以遍历所有边缘和所有顶点,但不包含有关所有对象如何连接的信息.
假设我们添加了几个LinkedList< Connection>对象.实际上,每个顶点一个.连接只是边缘和顶点相交的地方.因此,边缘将具有两个Connection对象(对于无向图),而顶点将具有一个LinkedList< Connection>.对象,表示与它连接的每个Edge的连接.本质上,这是一个事件列表.
如果删除某些Connection对象,则可以修改它以表示有向图.更具体地说,您必须选择在哪些地方没有这些引用.您可以选择从关联的LinkedList< Connection>中删除连接.如果您不希望从顶点看到边缘(对于上面的示例,N2将有一个空的LinkedList< Connection>).您可能改为选择在Edge上使引用成为可选(对于上面的示例,E1将有一个指向N2的连接,而一个Connection为空,从而允许从E1遍历到N2,但不能返回到N1.您选择如何实现一个是更直观的-边缘是定向的,因此删除边缘上的连接以决定它们的连接方式似乎合乎逻辑.另一个可能一开始看起来有些复杂,但会阻止您不必要地跳到进行广度优先和深度优先搜索时无用的边缘.
点形式:
>在发生列表的实现中,我有.您需要实施吗?
>严格来说,您可以只存储传出的边缘.但是,回溯算法可能会受益于能够沿其行进的参考进行回溯.当然,您可以使用某种历史来实现此目的,因此可能不需要考虑太多.
>如果两者都做,则可能需要某种方法来区分它是传入还是传出.是否通过具有两个LinkedList< Connection>顶点上的对象,或者在Connection上具有布尔型pointingToVertex原语,或任何其他方式.也许您的边缘将是有方向的,而无方向的边缘将由两个指向相反方向的边缘组成.根据您的结构需要进行考虑.