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