Проверете дали двойно свързан списък със знаци е палиндром или не
Като се има предвид a двойно свързан списък на герои задачата е да се провери дали двойно свързаният списък е a палиндром или не.
Примери:
вход:
![]()
Изход: вярно
Обяснение: Списъкът съответства на „НИВО“, което е палиндром.
вход:
![]()
Изход: Невярно
Обяснение: Списъкът съответства на „LEVES“, което не е палиндром.
Подход:
Идеята е да се инициализират два указателя: наляво (първоначално настроен на главата) и точно (първоначално настроен на опашка). Сравнете стойностите на двата указателя, докато наляво не е равно на нула или наляво се премести на следващия от точно. Ако стойностите на двата указателя са равен движи се наляво към следващия показалец и точно към предишния показалец. В противен случай върнете false.
По-долу е изпълнението на горния подход:
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' );
Изход
True
Времева сложност: O(n), където n е броят на възлите в двойно свързания списък.
Помощно пространство: О(1)
Свързани статии:
- Функция за проверка дали единично свързан списък е палиндром
- Проверете дали свързан списък от низове образува палиндром