【发布时间】:2012-09-02 23:15:23
【问题描述】:
问题:我有一个单链表(即只有指向下一个节点的指针的列表)。此外,这是一个循环链表(在此示例中,最后一个节点具有指向第一个节点的指针)。列表中的每个节点都包含一个字符。
此类列表的示例可以是:a->b->c->b->a
现在如何验证此列表是否为回文?
我想到了以下解决方案:
从列表的头部开始。找到列表的长度,然后找到中间节点。现在从列表的头部重新开始,并继续将元素推入堆栈直到中间。现在从 mid 和 pop 元素遍历列表。如果弹出元素的值等于当前节点的值。如果不是,则返回 false。否则,继续直到堆栈为空并且我们已经验证了所有字符。缺点:使用额外的堆栈空间:(
从列表的头部开始。找到列表的长度,然后找到中间节点。现在反转这个列表的第二半。然后使用 2 个指针(一个指向开始,另一个指向中间 + 1 个元素),检查值是否相同。如果不是,则返回 false。否则继续,直到我们再次到达起始节点。缺点:更改原始数据结构。
有没有更优雅的方法来解决这个问题(希望不使用 O(n) 额外空间或更改原始列表)?我对算法感兴趣,而不是任何具体的实现。
谢谢
【问题讨论】:
-
为什么这个人删除了他的答案,其中有类似于 2 的建议?
-
这是我的问题,您想检查它是否包含列表中
head中的回文?或者回文可以从任何节点开始? -
@st0le 我在考虑回文从头部开始的情况。这比回文可以从任何节点开始的情况更简单(或者我们必须在列表中找到最长的回文)
-
如果您可以使用额外的 O(n) 内存,则不需要弗洛伊德算法,也不需要答案中表现出的任何聪明才智。只需将列表复制到数组并检查它是否是回文。完成。
标签: algorithm data-structures linked-list