Dada una lista enlazada, escribe una función para invertir cada k Node (donde k es una entrada a la función).
Ejemplo:
Entrada : 1->2->3->4->5->6->7->8->NULL, K = 3
Salida : 3->2->1->6->5->4- >8->7->NULO
Entrada : 1->2->3->4->5->6->7->8->NULO, K = 5
Salida : 5->4->3-> 2->1->8->7->6->NULO
Algoritmo: inverso (cabeza, k)
- Invierta la primera sublista de tamaño k. Mientras retrocede, realice un seguimiento del siguiente Node y del Node anterior. Deje que el puntero al siguiente Node sea next y el puntero al Node anterior sea prev . Consulte esta publicación para invertir una lista vinculada.
- head->next = reverse(next, k) (Llama recursivamente al resto de la lista y vincula las dos sublistas)
- Return prev ( prev se convierte en el nuevo encabezado de la lista (ver los diagramas de un método iterativo de esta publicación )
La siguiente imagen muestra cómo funciona la función inversa:
A continuación se muestra la implementación del enfoque anterior:
Javascript
<script> // Javascript program to reverse a // linked list in groups of // given size // Head of list var head; // Linked list Node class Node { constructor(val) { this.data = val; this.next = null; } } function reverse(head, k) { if (head == null) return null; var current = head; var next = null; var prev = null; var count = 0; // Reverse first k nodes of // linked list while (count < k && current != null) { next = current.next; current.next = prev; prev = current; current = next; count++; } /* next is now a pointer to (k+1)th node Recursively call for the list starting from current. And make rest of the list as next of first node. */ if (next != null) head.next = reverse(next, k); // prev is now head of input list return prev; } // Utility functions // Inserts a new Node at front // of the list. function push(new_data) { /* 1 & 2: Allocate the Node & Put in the data */ new_node = new Node(new_data); // 3. Make next of new Node as head new_node.next = head; // 4. Move the head to point to // new Node head = new_node; } // Function to print linked list function printList() { temp = head; while (temp != null) { document.write(temp.data + " "); temp = temp.next; } document.write("<br/>"); } // Driver code /* Create Linked List 1->2->3->4->5->6-> 7->8->8->9->null */ push(9); push(8); push(7); push(6); push(5); push(4); push(3); push(2); push(1); document.write("Given Linked List<br/>"); printList(); head = reverse(head, 3); document.write("Reversed list<br/>"); printList(); // This code is contributed by gauravrajput1 </script>
Producción:
Given Linked List 1 2 3 4 5 6 7 8 9 Reversed list 3 2 1 6 5 4 9 8 7
Análisis de Complejidad:
- Complejidad temporal: O(n).
El recorrido de la lista se realiza solo una vez y tiene ‘n’ elementos. - Espacio Auxiliar: O(n/k).
Para cada Lista Enlazada de tamaño n, n/k o (n/k)+1 se realizarán llamadas durante la recursividad.
Consulte el artículo completo sobre Invertir una lista vinculada en grupos de tamaño determinado | ¡ Establezca 1 para 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