Dada una lista doblemente enlazada, gire la lista enlazada en sentido contrario a las agujas del reloj por N Nodes. Aquí N es un número entero positivo dado y es más pequeño que el número de Nodes en la lista enlazada.
N = 2
Lista rotada:
Ejemplos:
Input : a b c d e N = 2 Output : c d e a b Input : a b c d e f g h N = 4 Output : e f g h a b c d
Preguntado en Amazon
Para rotar la lista Doblemente enlazada, necesitamos cambiar el siguiente del Node N a NULL, el siguiente del último Node al Node principal anterior y el anterior del Node principal al último Node y finalmente cambiar el encabezado al (N + 1) Node y anterior de nuevo Node principal a NULL (Anterior del Node principal en la lista doblemente enlazada es NULL)
Por lo tanto, debemos obtener tres Nodes: enésimo Node, (N + 1) Node enésimo y último Node. Recorra la lista desde el principio y deténgase en el Node N. Almacene el puntero al Node N. Podemos obtener (N+1) Node usando NthNode->next. Continúe recorriendo hasta el final y almacene el puntero en el último Node también. Finalmente, cambie los punteros como se indicó anteriormente y en la última lista rotada de impresión usando
la función PrintList.
C++
// C++ program to rotate a Doubly linked // list counter clock wise by N times #include <bits/stdc++.h> using namespace std; /* Link list node */ struct Node { char data; struct Node* prev; struct Node* next; }; // This function rotates a doubly linked // list counter-clockwise and updates the // head. The function assumes that N is // smallerthan size of linked list. It // doesn't modify the list if N is greater // than or equal to size void rotate(struct Node** head_ref, int N) { if (N == 0) return; // Let us understand the below code // for example N = 2 and // list = a <-> b <-> c <-> d <-> e. struct Node* current = *head_ref; // current will either point to Nth // or NULL after this loop. Current // will point to node 'b' in the // above example int count = 1; while (count < N && current != NULL) { current = current->next; count++; } // If current is NULL, N is greater // than or equal to count of nodes // in linked list. Don't change the // list in this case if (current == NULL) return; // current points to Nth node. Store // it in a variable. NthNode points to // node 'b' in the above example struct Node* NthNode = current; // current will point to last node // after this loop current will point // to node 'e' in the above example while (current->next != NULL) current = current->next; // Change next of last node to previous // head. Next of 'e' is now changed to // node 'a' current->next = *head_ref; // Change prev of Head node to current // Prev of 'a' is now changed to node 'e' (*head_ref)->prev = current; // Change head to (N+1)th node // head is now changed to node 'c' *head_ref = NthNode->next; // Change prev of New Head node to NULL // Because Prev of Head Node in Doubly // linked list is NULL (*head_ref)->prev = NULL; // change next of Nth node to NULL // next of 'b' is now NULL NthNode->next = NULL; } // Function to insert a node at the // beginning of the Doubly Linked List void push(struct Node** head_ref, int new_data) { struct Node* new_node = new Node; new_node->data = new_data; new_node->prev = NULL; new_node->next = (*head_ref); if ((*head_ref) != NULL) (*head_ref)->prev = new_node; *head_ref = new_node; } /* Function to print linked list */ void printList(struct Node* node) { while (node->next != NULL) { cout << node->data << " " << "<=>" << " "; node = node->next; } cout << node->data; } // Driver's Code int main(void) { /* Start with the empty list */ struct Node* head = NULL; /* Let us create the doubly linked list a<->b<->c<->d<->e */ push(&head, 'e'); push(&head, 'd'); push(&head, 'c'); push(&head, 'b'); push(&head, 'a'); int N = 2; cout << "Given linked list "; printList(head); rotate(&head, N); cout << " Rotated Linked list "; printList(head); return 0; }
Given linked list a b c d e Rotated Linked list c d e a b
Complejidad de tiempo: O(N) (N es el número de Nodes de la lista enlazada)
Espacio auxiliar: O(N)
Consulte el artículo completo sobre Rotar lista doblemente enlazada por N Nodes para obtener más detalles.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA