以恒定的空间和线性时间向后打印单链表

时间:2011-06-01 17:12:01

标签: algorithm language-agnostic linked-list

我听到了一个采访问题:

  

“向后打印单链表,   在恒定的空间和线性时间内。“

我的解决方案是将链接列表反转到原位,然后将其打印出来。还有另一种非破坏性的解决方案吗?

6 个答案:

答案 0 :(得分:11)

您已经找到了大部分答案:将链接列表反转到位,并将列表遍历到开头以打印它。为了防止它(永久性地)具有破坏性,当您将其遍历到开头并打印时,将再次反转链接列表。

但是,请注意,这只适用于您只有一个执行线程,或者使整个遍历成为一个关键部分,因此一次只有一个线程可以执行(即,第二个线程永远不能使用列表在遍历中间。)

答案 1 :(得分:8)

只需沿途进行迭代和打印,但将显示器颠倒过来。

˙uoıʇɐɯɹoɟsuɐɹʇɐɹʇxǝʇǝʇlʇʇılɐɥʇɥʇʍʍʇɥƃɹɹʇɯɯʞʞɐɔɐɔ<

答案 2 :(得分:8)

如果在打印后再次将其反转,则不再具有破坏性,因为原始订单已恢复。

答案 3 :(得分:1)

您可以使用链接列表链中的递归调用,并引用您要写入的内容。每个节点都会使用子节点的打印功能,同时在打印之前传递引用。

这样,列表中的每个节点都会向下传递,直到最后一个节点不能直接写入,然后每个备份链都会在最后一个节点之后写回到前面。

修改

由于堆栈上的线性空间,这实际上不符合规范。如果你有外面的东西来执行函数和写入字符串前面的方法,基本逻辑仍然可以工作。

答案 4 :(得分:1)

这是一种非常规方法:将控制台更改为从右向左阅读顺序,然后按正常顺序打印列表。它们将以向后的顺序出现。必须以相反的顺序访问实际数据并不像是对问题的限制。

答案 5 :(得分:1)

好吧,这可能是一个面试问题,但它实际上是weis算法书背后的问题。问题清楚地表明,我们不能使用递归(面试官将隐藏和揭示的东西),因为递归不会使用恒定的空间,而且递归将成为未来的主要观点。解决方案是反向打印和反向打印。