Matemáticamente, puede pensar en una lista enlazada (posiblemente conteniendo un ciclo) como una función parcial de un conjunto de nodos en sí mismo, donde cada nodo mapea a su sucesor y cada nodo es eventualmente accesible desde el nodo de inicio. (El último nodo no tiene sucesor). Invertir una lista enlazada implicaría invertir esta función, ya que seguir un enlace y luego retroceder debería terminar en el punto donde comenzó.
Si la lista vinculada no contiene un ciclo, esta función parcial es inyectiva (uno a uno), lo que significa que no hay dos nodos asignados al mismo sucesor. Las funciones de inyección se pueden invertir, por lo que puede invertir una lista vinculada regular. Sin embargo, si la lista contiene un ciclo, entonces hay dos nodos con el mismo sucesor, por lo que la función no es inyectiva y, por lo tanto, no tiene una inversa. Entonces, no, no puede revertir la lista vinculada y esperar obtener otra lista vinculada, si la lista tiene un ciclo.
Sin embargo, si trata la lista vinculada como un gráfico más general en el que cada nodo puede tener cualquier número de bordes entrantes o salientes, entonces el inverso sí existe. Ya no es una lista vinculada.
Excelente desglose y explicación clara. Muchas gracias. – Sam
@templatetypedef - "si trata la lista vinculada como un gráfico más general en el que cada nodo puede tener cualquier cantidad de bordes entrantes o salientes, entonces el inverso sí existe". ¿Puedes extrapolar un poco sobre esto un poco? El gráfico aún tendría ciclos, lo que significa que el mismo problema que señaló seguiría existiendo, es decir, que "hay dos nodos con el mismo sucesor" en el gráfico. ¿Cómo se abordaría esa situación? –
@ TravisJ- Si tiene una lista vinculada que contiene un ciclo e invierte todos los bordes, algunas celdas pueden tener múltiples bordes salientes. Eso es un problema si desea que el resultado sea una lista vinculada, pero está totalmente bien si permite múltiples bordes salientes de cada nodo. ¿Tiene sentido? – templatetypedef