📜  检查字符的双向链表是否为回文

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

检查字符的双向链表是否为回文

给定一个字符的双向链表,编写一个函数,如果给定的双向链表是回文,则返回真,否则返回假。

回文双链表

  1. 创建一个双向链表,其中每个节点只包含一个字符串的字符。
  2. 在初始化列表的开始和在列表的末尾留下了两个三分球。
  3. 检查左节点上的数据是否等于右节点。如果相等,则向左递增并向右递减直到列表的中间。如果在任何阶段不相等,则返回 false。
C++
// C++ program to check if doubly
// linked list is palindrome or not
#include
using namespace std;
 
// Structure of node
struct Node
{
    char data;
    struct Node *next;
    struct Node *prev;
};
 
/* Given a reference (pointer to pointer) to
   the head of a list and an int, inserts a
   new node on the front of the list. */
void push(struct Node** head_ref, char new_data)
{
    struct Node* new_node = new Node;
    new_node->data  = new_data;
    new_node->next = (*head_ref);
    new_node->prev = NULL;
    if ((*head_ref) !=  NULL)
      (*head_ref)->prev = new_node ;
    (*head_ref)    = new_node;
}
 
// Function to check if list is palindrome or not
bool isPalindrome(struct Node *left)
{
    if (left == NULL)
       return true;
 
    // Find rightmost node
    struct Node *right = left;
    while (right->next != NULL)
        right = right->next;
 
    while (left != right)
    {
        if (left->data != right->data)
            return false;
 
        left = left->next;
        right = right->prev;
    }
 
    return true;
}
 
// Driver program
int main()
{
    struct Node* head = NULL;
    push(&head, 'l');
    push(&head, 'e');
    push(&head, 'v');
    push(&head, 'e');
    push(&head, 'l');
 
    if (isPalindrome(head))
        printf("It is Palindrome");
    else
        printf("Not Palindrome");
 
    return 0;
}


Java
// Java program to check if doubly
// linked list is palindrome or not
class GFG
{
 
// Structure of node
static class Node
{
    char data;
    Node next;
    Node prev;
};
 
/* Given a reference (pointer to pointer) to
the head of a list and an int, inserts a
new node on the front of the list. */
static Node push(Node head_ref, char new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    new_node.prev = null;
    if (head_ref != null)
    head_ref.prev = new_node ;
    head_ref = new_node;
    return head_ref;
}
 
// Function to check if list is palindrome or not
static boolean isPalindrome(Node left)
{
    if (left == null)
    return true;
 
    // Find rightmost node
    Node right = left;
    while (right.next != null)
        right = right.next;
 
    while (left != right)
    {
        if (left.data != right.data)
            return false;
 
        left = left.next;
        right = right.prev;
    }
 
    return true;
}
 
// Driver program
public static void main(String[] args)
{
    Node head = null;
    head = push(head, 'l');
    head = push(head, 'e');
    head = push(head, 'v');
    head = push(head, 'e');
    head = push(head, 'l');
 
    if (isPalindrome(head))
        System.out.printf("It is Palindrome");
    else
        System.out.printf("Not Palindrome");
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program to check if doubly
# linked list is a palindrome or not
 
class Node:
  
    def __init__(self, data, next, prev):
        self.data = data
        self.next = next
        self.prev = prev
 
# Given a reference (pointer to pointer) to
# the head of a list and an int, inserts
# a new node on the front of the list.
def push(head_ref, new_data):
  
    new_node = Node(new_data, head_ref, None)
 
    if head_ref != None:
        head_ref.prev = new_node
        head_ref = new_node
         
    return head_ref
  
# Function to check if list is palindrome or not
def isPalindrome(left):
  
    if left == None:
        return True
 
    # Find rightmost node
    right = left
    while right.next != None:
        right = right.next
 
    while left != right:
      
        if left.data != right.data:
            return False
 
        left = left.next
        right = right.prev
      
    return True
  
# Driver program
if __name__ == "__main__":
  
    head = None
    head = push(head, 'l')
    head = push(head, 'e')
    head = push(head, 'v')
    head = push(head, 'e')
    head = push(head, 'l')
 
    if isPalindrome(head):
        print("It is Palindrome")
    else:
        print("Not Palindrome")
 
# This code is contributed by Rituraj Jain


C#
// C# program to check if doubly
// linked list is palindrome or not
using System;
 
class GFG
{
 
// Structure of node
public class Node
{
    public char data;
    public Node next;
    public Node prev;
};
 
/* Given a reference (pointer to pointer) to
the head of a list and an int, inserts a
new node on the front of the list. */
static Node push(Node head_ref, char new_data)
{
    Node new_node = new Node();
    new_node.data = new_data;
    new_node.next = head_ref;
    new_node.prev = null;
    if (head_ref != null)
    head_ref.prev = new_node ;
    head_ref = new_node;
    return head_ref;
}
 
// Function to check if list is palindrome or not
static bool isPalindrome(Node left)
{
    if (left == null)
    return true;
 
    // Find rightmost node
    Node right = left;
    while (right.next != null)
        right = right.next;
 
    while (left != right)
    {
        if (left.data != right.data)
            return false;
 
        left = left.next;
        right = right.prev;
    }
 
    return true;
}
 
// Driver program
public static void Main(String[] args)
{
    Node head = null;
    head = push(head, 'l');
    head = push(head, 'e');
    head = push(head, 'v');
    head = push(head, 'e');
    head = push(head, 'l');
 
    if (isPalindrome(head))
        Console.Write("It is Palindrome");
    else
        Console.Write("Not Palindrome");
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:

It is Palindrome

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

相关帖子:



  • 检查单向链表是否为回文的函数
  • 检查字符串的链表是否形成回文

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程