📌  相关文章
📜  检查单链表是否为回文的 Javascript 程序

📅  最后修改于: 2022-05-13 01:57:44.069000             🧑  作者: Mango

检查单链表是否为回文的 Javascript 程序

给定一个单链字符列表,编写一个函数,如果给定列表是回文,则返回 true,否则返回 false。

回文链表

方法 1(使用堆栈)

  • 一个简单的解决方案是使用一堆列表节点。这主要涉及三个步骤。
  • 从头到尾遍历给定列表,并将每个访问的节点推送到堆栈。
  • 再次遍历列表。对于每个访问的节点,从堆栈中弹出一个节点,并将弹出节点的数据与当前访问的节点进行比较。
  • 如果所有节点都匹配,则返回 true,否则返回 false。

下图是上述方法的试运行:

以下是上述方法的实现:

Javascript


Javascript


Javascript

输出:

a->NULL
Is Palindrome

b->a->NULL
Not Palindrome

a->b->a->NULL
Is Palindrome

c->a->b->a->NULL
Not Palindrome

a->c->a->b->a->NULL
Not Palindrome

b->a->c->a->b->a->NULL
Not Palindrome

a->b->a->c->a->b->a->NULL
Is Palindrome

时间复杂度: O(n)
辅助空间: O(1)

方法 3(使用递归):
使用左右两个指针。使用递归左右移动并检查每个递归调用中的跟随。
1)子列表是回文。
2)当前左右的值是匹配的。

如果上述两个条件都为真,则返回真。

这个想法是使用函数调用堆栈作为容器。递归遍历直到列表的末尾。当我们从最后一个 NULL 返回时,我们将在最后一个节点。最后一个节点将与列表的第一个节点进行比较。

为了访问列表的第一个节点,我们需要列表头在最后一次递归调用中可用。因此,我们也将 head 传递给递归函数。如果它们都匹配,我们需要比较 (2, n-2) 个节点。同样,当递归回退到 (n-2)nd 节点时,我们需要从头开始引用第二个节点。我们在前一个调用中推进头指针,以指向列表中的下一个节点。
然而,诀窍是识别双指针。传递单个指针与传递值一样好,我们将一次又一次地传递同一个指针。我们需要传递头指针的地址来反映父递归调用的变化。
感谢Sharad Chandra提出这种方法。

Javascript