单链表上的双向迭代

时间:2013-10-03 15:21:54

标签: java data-structures iterator singly-linked-list bidirectional

我目前正在攻读数据结构考试,并遇到了有关迭代的问题。

是否可以在单链表上实现双向迭代器?如果是这样,那么如何实施呢?

我有一个想法,首先转发遍历链表并存储一个临时链表,该列表反向保存节点。但遍历此临时列表将导致迭代器仅允许向后遍历。

3 个答案:

答案 0 :(得分:4)

这个答案假定列表必须始终保持单链:

您只需要指向第一个元素的指针和指向当前元素的指针。

当你向前迭代时,增加一些计数器以知道你迭代了多少次。 (插入可能使迭代器无效!)。我们称这个变量为count

现在,如果你想从当前元素迭代k值,你知道你需要从第一个元素count - k次迭代FORWARDS。

编辑:我们当然可以提高效率;这个答案是一种蛮力的方法。

正如上面提到的评论之一,你可以在向前迭代时将指针推入堆栈,然后在向后迭代时将它们弹出。

如果列表并不总是必须保持单链接,那么您可以在向前迭代时添加向后链接,然后在向后迭代时删除这些链接(尽管谁知道您想要的原因)。 / p>

答案 1 :(得分:3)

您始终可以使用跟踪当前节点的变量。 如果你想向前走,就像平常一样。如果要向后移动,只需从第一个节点开始,然后继续移动,直到下一个节点等于当前节点。

答案 2 :(得分:0)

另一种方法是:在创建迭代器时,创建一个数组,其大小是链表的大小,但不填充它。在迭代器中保留索引以及“当前节点”。每次向前移动迭代器时,也将数组中的节点引用放在适当的索引处。要向后移动迭代器,只需递减索引并查看数组以查看您已访问过的节点。我认为这几乎等同于@DarthVader提到的“堆栈”。这样做的好处是,如果您希望调用者执行后向遍历的 lot ;其他人提到的简单解决方案每次进行后向遍历时都会使用O(n),但使用像数组这样的方法将是O(1)。当迭代器向前移动时,缺点是更多的簿记。在现实生活中,必须权衡利弊。对于相对较小的列表,它可能不值得。但假设您获得了一个包含单链接记录的大型磁盘文件,并且您需要一个遍历该文件的迭代器;如果你想给迭代器提供向后的能力,你不想重新读取整个文件只是为了找到一个前一个节点。