Por que ésta pequeña función de invertir una lista enlazda funciona?

Iniciado por ShadowA7X, 24 Noviembre 2014, 23:59 PM

0 Miembros y 1 Visitante están viendo este tema.

ShadowA7X

Hola chicos/as que tal? espero que estén bien. Vine nuevamente aquí porque uds siempre me sacan las dudas precisas que tengo, y debo aclarar que les estoy muy agradecido. Ahora bien necesito que por favor alguien me explique (si es posible con manzanitas o dibujitos xd) por qué ésta función de invertir lista funciona tan bien:







typedef struct NODO{

char *nombre;
struct NODO *sgte;

}nodo;

void invertirlista(nodo **inicio){

nodo *aux,*next;

aux=*inicio;
*inicio=NULL;

while(aux!=NULL){

next=aux->sgte;
aux->sgte=*inicio;
*inicio=aux;
aux=next;

}
}


El typedef lo coloqué por si alguien siente necesario saber como fue hecha la lista (aunque verdaderamente no creo que importe para la pregunta que estoy haciendo).Sé como crear,mostrar y eliminar listas y nodos, he intentado esquematizar ésta función tan corta pero no he podido aclararle a mi cabeza como funciona. De antemano muchas gracias por su ayuda  :)


avesudra

#1
Hola ShadowA7X, es un código muy limpio y la verdad bastante bueno. Te pongo un ejemplo práctico de lo que hace el algoritmo. Tenemos una lista con 4 nodos (o lista da igual como los llames):

P Q R S

Sabemos que esos nodos tienen un puntero al nodo siguiente, y esos estan tal que asi:

P -> Q , Q -> R , R -> S y S -> NULL

(entendiendo esa flechita por, "el nodo P tiene un puntero que apunta a Q")

Lo que hace esto es invertir el sentido, es decir, que P apunte a NULL, Q apunte a P , R apunte a Q y S apunte a R. (entendiendo por apuntar, que el nodo tiene un puntero que apunta a otro nodo). Realmente no modifica la lista en sí, sino a quienes apuntan sus nodos, el meollo del asunto está aqui:
next=aux->sgte;
aux->sgte=*inicio;


Saludos.
Regístrate en