С обзиром на а двоповезана листа оф ликова задатак је да се провери да ли је двоструко повезана листа а палиндром или не.
Примери:
Улаз:
![]()
Излаз: Истина
Објашњење: Листа одговара 'НИВОУ' који је палиндром.јава цатцх покушај
Улаз:
![]()
Излаз: Фалсе
Објашњење: Листа одговара 'ЛЕВЕС' који није палиндром.
приступ:
Идеја је да се иницијализују два показивача: лево (у почетку постављен на главу) и право (у почетку постављен на реп). Упоредите вредности два показивача док лево није једнако нултом или лево се преселио у следећу од право. Ако су вредности два показивача једнаки кретати се лево до следећег показивача и право на претходни показивач. У супротном врати фалсе.
Испод је примена горњег приступа:
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');
Излаз
True
Временска сложеност: О(н) где је н број чворова у двоструко повезаној листи.
Помоћни простор: О(1)
стринг то дате
Повезани чланци:
- Функција за проверу да ли је једноструко повезана листа палиндром
- Проверите да ли повезана листа стрингова формира палиндром