Compruebe si una lista de caracteres doblemente enlazada es palíndromo o no

Compruebe si una lista de caracteres doblemente enlazada es palíndromo o no

dado un lista doblemente enlazada de personajes la tarea es comprobar si la lista doblemente enlazada es una palíndromo O no.

Ejemplos:

Aporte:

comprobar si una lista-de-caracteres-doblemente-enlazada-es-palíndromo-o-no


Producción: Verdadero
Explicación: La lista corresponde a 'NIVEL' que es un palíndromo.


Aporte:

comprobar si una lista-de-caracteres-doblemente-enlazada-es-palíndromo-o-no-2


Producción: FALSO
Explicación: La lista corresponde a 'LEVES' que no es un palíndromo.

Acercarse:

La idea es inicializar dos punteros: izquierda (inicialmente configurado como encabezado) y bien (inicialmente configurado en la cola). Compare los valores de los dos punteros mientras izquierda no es igual a nulo o izquierda se ha movido al siguiente de bien. Si los valores de los dos punteros son igual mover izquierda al siguiente puntero y bien al puntero anterior. De lo contrario, devuelve falso.

A continuación se muestra la implementación del enfoque anterior:

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  (  'True  n  '  );      else      printf  (  'False  n  '  );      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'  );   

Producción
True 

Complejidad del tiempo: O(n) donde n es el número de nodos en la lista doblemente enlazada.
Espacio Auxiliar: O(1)

Artículos relacionados:   

  • Función para comprobar si una lista enlazada individualmente es un palíndromo
  • Compruebe si una lista enlazada de cadenas forma un palíndromo
Crear cuestionario