问题:我有一个单链表(即只有指向下一个节点的指针的列表)。此外,这是一个循环链表(在这个例子中,最后一个节点有一个指向第一个节点的指针)。列表中的每个节点都包含一个字符。
此类列表的示例可以是:a->b->c->b->a
现在我如何验证这个列表是否是一个pallindrome?
我想到了以下解决方案:
从列表的头部开始。找到列表的长度,然后找到中间节点。现在从列表的头部重新开始,并继续将元素推入堆栈直到中间。现在从 mid 和 pop 元素遍历列表。如果弹出元素的值等于当前节点的值。如果不是,则返回 false。否则,继续直到堆栈为空并且我们已经验证了所有字符。缺点:使用额外的堆栈空间:(
从列表的头部开始。找到列表的长度,然后找到中间节点。现在反转这个列表的第二半。然后使用 2 个指针(一个指向开始,另一个指向中间 + 1 个元素),检查值是否相同。如果不是,则返回 false。否则继续,直到我们再次到达起始节点。缺点:更改原始数据结构。
有没有更优雅的方法来解决这个问题(希望不使用 O(n) 额外空间或更改原始列表)?我对算法感兴趣,而不是任何特定的实现。
谢谢