我目前正在攻读数据结构考试,并遇到了有关迭代的问题。
是否可以在单链表上实现双向迭代器?如果是这样,那么如何实施呢?
我有一个想法,首先转发遍历链表并存储一个临时链表,该列表反向保存节点。但遍历此临时列表将导致迭代器仅允许向后遍历。
答案 0 :(得分:4)
这个答案假定列表必须始终保持单链:
您只需要指向第一个元素的指针和指向当前元素的指针。
当你向前迭代时,增加一些计数器以知道你迭代了多少次。 (插入可能使迭代器无效!)。我们称这个变量为count
现在,如果你想从当前元素迭代k
值,你知道你需要从第一个元素count - k
次迭代FORWARDS。
正如上面提到的评论之一,你可以在向前迭代时将指针推入堆栈,然后在向后迭代时将它们弹出。
如果列表并不总是必须保持单链接,那么您可以在向前迭代时添加向后链接,然后在向后迭代时删除这些链接(尽管谁知道您想要的原因)。 / p>
答案 1 :(得分:3)
您始终可以使用跟踪当前节点的变量。 如果你想向前走,就像平常一样。如果要向后移动,只需从第一个节点开始,然后继续移动,直到下一个节点等于当前节点。
答案 2 :(得分:0)
另一种方法是:在创建迭代器时,创建一个数组,其大小是链表的大小,但不填充它。在迭代器中保留索引以及“当前节点”。每次向前移动迭代器时,也将数组中的节点引用放在适当的索引处。要向后移动迭代器,只需递减索引并查看数组以查看您已访问过的节点。我认为这几乎等同于@DarthVader提到的“堆栈”。这样做的好处是,如果您希望调用者执行后向遍历的 lot ;其他人提到的简单解决方案每次进行后向遍历时都会使用O(n),但使用像数组这样的方法将是O(1)。当迭代器向前移动时,缺点是更多的簿记。在现实生活中,必须权衡利弊。对于相对较小的列表,它可能不值得。但假设您获得了一个包含单链接记录的大型磁盘文件,并且您需要一个遍历该文件的迭代器;如果你想给迭代器提供向后的能力,你不想重新读取整个文件只是为了找到一个前一个节点。