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