Patikrinkite, ar dvigubai susietas simbolių sąrašas yra palindromas, ar ne

Patikrinkite, ar dvigubai susietas simbolių sąrašas yra palindromas, ar ne

Atsižvelgiant į a dvigubai susietas sąrašas simbolių užduotis yra patikrinti, ar dvigubai susietas sąrašas yra a palindromas ar ne.

Pavyzdžiai:

Įvestis:

patikrinkite, ar-dvigubai susietas-simbolių sąrašas yra palindromas, ar ne


Išvestis: Tiesa
Paaiškinimas: Sąrašas atitinka „LYGIS“, kuris yra palindromas.


Įvestis:

patikrinkite, ar dvigubai susietas simbolių sąrašas yra palindromas ar ne 2


Išvestis: Netiesa
Paaiškinimas: Sąrašas atitinka „LEVES“, kuris nėra palindromas.

Prieiga:

Idėja yra inicijuoti dvi nuorodas: paliko (iš pradžių nustatyta ant galvos) ir teisingai (iš pradžių nustatyta prie uodegos). Palyginkite dviejų rodyklių reikšmes paliko nėra lygus nuliui arba paliko persikėlė į kitą teisingai. Jei dviejų rodyklių reikšmės yra lygus judėti paliko prie kito rodyklės ir teisingai į ankstesnį žymeklį. Priešingu atveju grąžinkite klaidingą.

Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:

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'  );   

Išvestis
True 

Laiko sudėtingumas: O(n) kur n yra mazgų skaičius dvigubai susietame sąraše.
Pagalbinė erdvė: O(1)

Susiję straipsniai:   

  • Funkcija patikrinti, ar atskirai susietas sąrašas yra palindromas
  • Patikrinkite, ar susietas eilučių sąrašas sudaro palindromą
Sukurti viktoriną