确定单向链表是否为回文串的程序

2025年3月17日 | 阅读11分钟

说明

在此程序中,我们需要检查给定的单链表是否为回文。回文列表是指与其反转列表等价的列表。

Program to determine whether a singly linked list is the palindrome

上面图示中的列表是回文列表,因为它与其反转列表等价,即 1, 2, 3, 2, 1。要检查列表是否为回文,我们遍历该列表,并检查从前半部分开始的任何元素是否与从后半部分开始的任何元素不匹配,然后我们将标志变量设置为 false 并中断循环。

最后,如果 flag 为 false,则列表是回文,否则不是。检查列表是否为回文的算法如下。

算法

  1. 创建一个名为 Node 的类,它有两个属性:data 和 next。Next 是指向链表中下一个节点的指针。
  2. 创建另一个类 Palindrome,它具有三个属性:head、tail 和 size。
  3. addNode() 将向列表添加一个新节点
    1. 创建一个新节点。
    2. 它首先检查 head 是否等于 null,这意味着列表为空。
    3. 如果列表为空,则 head 和 tail 都将指向新添加的节点。
    4. 如果列表不为空,新节点将添加到列表末尾,使得 tail 的 next 指向新添加的节点。此新节点将成为列表的新 tail。
  4. reverseList() 将反转列表中节点的顺序
    1. Node current 将表示需要反转列表的节点。
    2. Node prevNode 表示 current 的前一个节点,nextNode 表示 current 的后一个节点。
    3. 通过交换每个节点的 prevNode 和 nextNode 来反转列表。
  5. isPalindrome() 将检查给定的列表是否为回文
    1. 声明一个 current 节点,它将最初指向 head 节点。
    2. 变量 flag 将存储布尔值 true。
    3. 通过将列表大小除以 2 来计算列表的中间点。
    4. 遍历列表,直到 current 指向中间节点。
    5. 使用 reverseList() 反转中间节点之后的列表直到最后一个节点。此列表将是列表的第二部分。
    6. 现在,比较列表前半部分和后半部分的节点。
    7. 如果任何节点不匹配,则将 flag 设置为 false 并中断循环。
    8. 如果循环结束后 flag 为 true,则表示列表是回文。
    9. 如果 flag 为 false,则列表不是回文。
  6. display() 将显示列表中存在的节点
    1. 定义一个节点 current,它最初将指向列表的 head。
    2. 遍历列表直到 current 指向 null。
    3. 通过使 current 在每次迭代中指向它的下一个节点来显示每个节点。

解决方案

Python

输出

 Nodes of the singly linked list:
1 2 3 2 1 
Given singly linked list is a palindrome

C

输出

Nodes of the singly linked list:
1 2 3 2 1 
Given singly linked list is a palindrome

JAVA

输出

Nodes of singly linked list: 
1 2 3 2 1 
Given singly linked list is a palindrome

C#

输出

Nodes of singly linked list: 
1 2 3 2 1 
Given singly linked list is a palindrome

PHP

输出

 Nodes of singly linked list: 
1 2 3 2 1 
Given singly linked list is a palindrome
 
下一主题#