Nuestros mejores desarrolladores han agotado sus reservas de café, investigando día y noche por la solución, hasta que Francisco halló la respuesta en Gitea y en este momento la compartimos aquí.
Solución:
El algoritmo recursivo general para esto es:
Divide
la lista en2
partes – primer nodo y resto de la lista.- Llamada recursivamente inversa para el
rest
de la lista enlazada. - Enlace
rest
afirst
. - Arreglar
head
puntero
Aquí está el código con comentarios en línea:
struct node* recursiveReverseLL(struct node* first)
if(first == NULL) return NULL; // list does not exist.
if(first->link == NULL) return first; // list with only one node.
struct node* rest = recursiveReverseLL(first->link); // recursive call on rest.
first->link->link = first; // make first; link to the last node in the reversed rest.
first->link = NULL; // since first is the new last, make its link NULL.
return rest; // rest now points to the head of the reversed list.
Espero que esta imagen aclare las cosas:
(fuente: geeksforgeeks.org)
.
Solución alternativa:
struct node *head;
void reverse(struct node *prev, struct node *cur)
if(cur)
reverse(cur,cur->link);
cur->link = prev;
else
head = prev;
En main, llama a reverse(NULL,head);
/* Reverses a linked list, returns head of reversed list
*/
NodePtr reverseList(NodePtr curr) curr->next == NULL) return curr; // empty or single element case
NodePtr nextElement = curr->next;
curr->next = NULL;
NodePtr head = reverseList(nextElement);
nextElement->next = curr;
return head;
valoraciones y reseñas
Si estás contento con lo expuesto, puedes dejar un enunciado acerca de qué le añadirías a este ensayo.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)