两个结构:一个集合和一个列表。
在集合中,您存储已经访问过的节点。这会阻止您遵循周期。
该列表包含以下对象:(1) 一个节点,以及 (2) 一个指向找到它的节点的指针。
从起始节点开始,将其添加到集合中,将其添加到具有空反向引用的列表中,然后将其可以到达的所有节点添加到具有反向引用到列表中索引 0 的列表中(起始节点)。
然后对于列表中的每个元素,直到您到达末尾,执行以下操作:
- 如果它在集合中已经跳过它(您已经访问过它)并移至列表中的下一个项目。
- 否则,将它添加到集合中,并将它可以到达的所有节点添加到列表中,并将反向引用您正在“查看”的索引添加到列表的末尾。然后转到列表中的下一个索引并重复。
如果您在任何时候到达结束节点(最好是在将其添加到列表时 - 而不是在列表中访问它),通过对起始节点的反向引用进行追溯并反转路径。
例子:
给定节点 0 到 3,其中
节点0 --> 节点1
节点0 --> 节点2
节点 1 --> 节点 2
节点 2 --> 节点 3
node0 为 START,node3 为 END
SET = {}
列表 = []
第 1 步 - 添加 START:
SET = {node0}
LIST = [[node0, null]]
第 2 步 - 在列表的索引 0 处 - 添加可达节点:
SET = {node0, node1, node2}
LIST = [[node0, null], [node1, 0], [node2, 0]]
第 3 步 - 在 LIST 的索引 1 处 - 添加可达节点:
node2 已经在 SET 中。跳过将可达节点添加到 LIST。
SET = {node0, node1, node2}
LIST = [[node0, null], [node1, 0], [node2, 0]]
第 4 步 - 在 LIST 的索引 2 处 - 添加可达节点:
SET = {node0, node1, node2, node3}
LIST = [[node0, null], [node1, 0], [node2, 0], [node3, 2]]
第 5 步 - 到达 END,现在回溯:
插入到 LIST 中的 END 节点(node3)有一个对列表中索引 2 的反向引用,即 node2。这对列表中的索引 0 有一个反向引用,即 node0 (START)。将其反转,您将得到 node0 --> node2 --> node3 的最短路径。