logo

Überprüfen Sie, ob eine doppelt verknüpfte Zeichenliste ein Palindrom ist oder nicht

Gegeben a doppelt verkettete Liste von Charaktere Die Aufgabe besteht darin, zu prüfen, ob es sich bei der doppelt verknüpften Liste um eine handelt Palindrom oder nicht.

Beispiele:

Eingang:



Überprüfen Sie, ob eine doppelt verknüpfte Zeichenliste ein Palindrom ist oder nicht' title=


Ausgabe: WAHR
Erläuterung: Die Liste entspricht „LEVEL“, einem Palindrom.

Ram-Schauspieler


Eingang:

Überprüfen Sie, ob eine doppelt verknüpfte Zeichenliste ein Palindrom ist oder nicht' loading='lazy' title=


Ausgabe: FALSCH
Erläuterung: Die Liste entspricht „LEVES“, was kein Palindrom ist.

Ansatz:

Die Idee besteht darin, zwei Zeiger zu initialisieren: links (ursprünglich auf Kopf eingestellt) und Rechts (ursprünglich auf Schwanz eingestellt). Vergleichen Sie die Werte der beiden Zeiger während links ist ungleich null oder links ist zum nächsten von verschoben Rechts. Wenn die Werte der beiden Zeiger sind gleich bewegen links zum nächsten Zeiger und Rechts zum vorherigen Zeiger. Andernfalls wird false zurückgegeben.

Nachfolgend finden Sie die Umsetzung des oben genannten Ansatzes:

C++
// C++ program to check if a doubly  // linked list is palindrome. #include    using namespace std; class Node { public:  char data;  Node* prev *next;  Node (char x) {  data = x;  prev = nullptr;  next = nullptr;  } }; // Function that returns true if the // doubly linked list is a palindrome bool isPalindrome(Node* head) {  if (head == nullptr) return true;    // Find the tail ptr.  Node *left=head *right=head;  while (right->next != nullptr) {  right = right->next;  }    // Check if the doubly linked list is   // a palindrome.  while (left!=right && left->prev!=right) {    // If char mismatch return  // false.  if (left->data != right->data)  return false;    // Move the pointers  left = left->next;  right = right->prev;  }    return true; } int main() {    // Doubly Linked list:   // L <-> E <-> V <-> E <-> L  Node *head = new Node('L');  head->next = new Node('E');  head->next->prev = head;  head->next->next = new Node('V');  head->next->next->prev = head->next;  head->next->next->next = new Node('E');  head->next->next->next->prev = head->next->next;  head->next->next->next->next = new Node('L');  head->next->next->next->next->prev = head->next->next->next;  if (isPalindrome(head))  cout << 'True';  else  cout << 'False';  return 0; } 
C
// C program to check if a doubly  // linked list is palindrome. #include  #include  struct Node {  char data;  struct Node* prev;  struct Node* next; }; // Function that returns true if the // doubly linked list is a palindrome int isPalindrome(struct Node* head) {  if (head == NULL) return 1;    // Find the tail ptr.  struct Node *left = head *right = head;  while (right->next != NULL) {  right = right->next;  }    // Check if the doubly linked list is   // a palindrome.  while (left != right && left->prev != right) {    // If char mismatch return  // false.  if (left->data != right->data)  return 0;    // Move the pointers  left = left->next;  right = right->prev;  }    return 1; } struct Node* createNode(char x) {  struct Node* newNode =   (struct Node*)malloc(sizeof(struct Node));  newNode->data = x;  newNode->prev = NULL;  newNode->next = NULL;  return newNode; } int main() {    // Doubly Linked list:   // L <-> E <-> V <-> E <-> L  struct Node *head = createNode('L');  head->next = createNode('E');  head->next->prev = head;  head->next->next = createNode('V');  head->next->next->prev = head->next;  head->next->next->next = createNode('E');  head->next->next->next->prev = head->next->next;  head->next->next->next->next = createNode('L');  head->next->next->next->next->prev = head->next->next->next;  if (isPalindrome(head))  printf('Truen');  else  printf('Falsen');  return 0; } 
Java
// Java program to check if a doubly  // linked list is palindrome. class Node {  char data;  Node prev next;  Node(char x) {  data = x;  prev = null;  next = null;  } } class GfG {  // Function that returns true if the  // doubly linked list is a palindrome  static boolean isPalindrome(Node head) {  if (head == null) return true;    // Find the tail ptr.  Node left = head right = head;  while (right.next != null) {  right = right.next;  }    // Check if the doubly linked list is   // a palindrome.  while (left != right && left.prev != right) {    // If char mismatch return  // false.  if (left.data != right.data)  return false;    // Move the pointers  left = left.next;  right = right.prev;  }    return true;  }  public static void main(String[] args) {  // Doubly Linked list:   // L <-> E <-> V <-> E <-> L  Node head = new Node('L');  head.next = new Node('E');  head.next.prev = head;  head.next.next = new Node('V');  head.next.next.prev = head.next;  head.next.next.next = new Node('E');  head.next.next.next.prev = head.next.next;  head.next.next.next.next = new Node('L');  head.next.next.next.next.prev = head.next.next.next;  if (isPalindrome(head))  System.out.println('True');  else  System.out.println('False');  } } 
Python
# Python program to check if a doubly  # linked list is palindrome. class Node: def __init__(self x): self.data = x self.prev = None self.next = None # Function that returns true if the # doubly linked list is a palindrome def isPalindrome(head): if head is None: return True # Find the tail ptr. left = head right = head while right.next is not None: right = right.next # Check if the doubly linked list is  # a palindrome. while left != right and left.prev != right: # If char mismatch return # false. if left.data != right.data: return False # Move the pointers left = left.next right = right.prev return True if __name__ == '__main__': # Doubly Linked list:  # L <-> E <-> V <-> E <-> L head = Node('L') head.next = Node('E') head.next.prev = head head.next.next = Node('V') head.next.next.prev = head.next head.next.next.next = Node('E') head.next.next.next.prev = head.next.next head.next.next.next.next = Node('L') head.next.next.next.next.prev = head.next.next.next if isPalindrome(head): print('True') else: print('False') 
C#
// C# program to check if a doubly  // linked list is palindrome. using System; class Node {  public char data;  public Node prev next;  public Node(char x) {  data = x;  prev = null;  next = null;  } } class GfG {  // Function that returns true if the  // doubly linked list is a palindrome  static bool isPalindrome(Node head) {  if (head == null) return true;    // Find the tail ptr.  Node left = head right = head;  while (right.next != null) {  right = right.next;  }    // Check if the doubly linked list is   // a palindrome.  while (left != right && left.prev != right) {    // If char mismatch return  // false.  if (left.data != right.data)  return false;    // Move the pointers  left = left.next;  right = right.prev;  }    return true;  }  static void Main(string[] args) {  // Doubly Linked list:   // L <-> E <-> V <-> E <-> L  Node head = new Node('L');  head.next = new Node('E');  head.next.prev = head;  head.next.next = new Node('V');  head.next.next.prev = head.next;  head.next.next.next = new Node('E');  head.next.next.next.prev = head.next.next;  head.next.next.next.next = new Node('L');  head.next.next.next.next.prev = head.next.next.next;    if (isPalindrome(head))  Console.WriteLine('True');  else  Console.WriteLine('False');  } } 
JavaScript
// JavaScript program to check if a doubly  // linked list is palindrome. class Node {  constructor(x) {  this.data = x;  this.prev = null;  this.next = null;  } } // Function that returns true if the // doubly linked list is a palindrome function isPalindrome(head) {  if (head === null) return true;    // Find the tail ptr.  let left = head right = head;  while (right.next !== null) {  right = right.next;  }    // Check if the doubly linked list is   // a palindrome.  while (left !== right && left.prev !== right) {    // If char mismatch return  // false.  if (left.data !== right.data)  return false;    // Move the pointers  left = left.next;  right = right.prev;  }    return true; } // Doubly Linked list:  // L <-> E <-> V <-> E <-> L let head = new Node('L'); head.next = new Node('E'); head.next.prev = head; head.next.next = new Node('V'); head.next.next.prev = head.next; head.next.next.next = new Node('E'); head.next.next.next.prev = head.next.next; head.next.next.next.next = new Node('L'); head.next.next.next.next.prev = head.next.next.next; if (isPalindrome(head))  console.log('True'); else  console.log('False'); 

Ausgabe
True

Zeitkomplexität: O(n) wobei n die Anzahl der Knoten in der doppelt verknüpften Liste ist.
Hilfsraum: O(1)

CSS-Mittelschaltfläche

Verwandte Artikel:   

  • Funktion zum Überprüfen, ob eine einfach verknüpfte Liste ein Palindrom ist
  • Überprüfen Sie, ob eine verknüpfte Liste von Zeichenfolgen ein Palindrom bildet
Quiz erstellen