Având în vedere a listă dublu legată de personaje sarcina este de a verifica dacă lista dublu legată este a palindrom sau nu.
Exemple:
Intrare:
![]()
Ieșire: Adevărat
Explicaţie: Lista corespunde cu „NIVEL”, care este un palindrom.exemplu de javascript
Intrare:
![]()
Ieșire: Fals
Explicaţie: Lista corespunde cu „LEVES”, care nu este un palindrom.
Abordare:
Ideea este de a inițializa două indicatoare: stânga (inițial pus la cap) și corect (inițial pus la coadă). Comparați valorile celor doi indicatori while stânga nu este egal cu nul sau stânga s-a mutat la următorul de corect. Dacă valorile celor doi indicatori sunt egal mişcare stânga la următorul indicator și corect la indicatorul anterior. În caz contrar, returnați false.
Mai jos este implementarea abordării de mai sus:
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');
Ieșire
True
Complexitatea timpului: O(n) unde n este numărul de noduri din lista dublu legată.
Spațiu auxiliar: O(1)
c programe exemple de programare
Articole înrudite:
- Funcție pentru a verifica dacă o listă legată individual este un palindrom
- Verificați dacă o listă legată de șiruri formează un palindrom