如何解决是否可以在不使用额外内存的情况下以 Θ(n) 时间复杂度检查单向链表是否是回文?
我刚刚参加了实习的在线面试,问题是检查单向链表是否是回文。我使用了一些内存来存储链表的数据。有人问我是否可以编写不使用额外内存的代码。我说可能需要超过 Θ(n) 即 Θ(n2).
对话过去了,最终归结为以下内容:
检查单向链表是否是回文在Θ(n)时间,同时不使用额外的内存,条件是输入数据不受干扰。
我说这是不可能的,但有人告诉我实际上是这样,我应该在互联网上查找。但是在我看到的所有算法中,至少有一个违反了这些条件,我个人认为这也是不可能的。
不使用额外的内存,我的意思是不使用 Θ(n) 内存。我们当然可以自由使用 Θ(1) 内存。
所以,如果有人能消除这个疑问,提前致谢:D
解决方法
在列表可能被暂时篡改的情况下,将其恢复到原始状态是可能的:
- 扫描列表一次以计算元素的数量。
- 使用该信息,再次扫描列表以找到列表后半部分的第一个元素。如果列表的长度为奇数,则这应该是中间元素之后的元素。
- 反转列表的后半部分。这可以使用额外的滞后和领先节点参考在线性时间内完成。请记住对最后一个节点的引用,该节点现在已成为反向列表后半部分的第一个节点。
- 再次遍历列表,但现在同时遍历列表的后半部分。记住所有的比较是否匹配(所以它是一个回文)
- 重复第 3 步恢复反转。
- 返回第 4 步的结果
该算法不使用线性辅助空间,并在列表上执行固定次数的遍历,使其具有线性时间复杂度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。