He estado trabajando en un proyecto de Java para una clase por un tiempo. Es una implementación de una lista enlazada (aquí llamada AddressList
, que contiene nodos simples llamadosListNode
). El problema es que todo tendría que hacerse con algoritmos recursivos. Pude hacer todo bien sin un método:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
En este momento, mi reverse
función solo llama a una función auxiliar que toma un argumento para permitir la recursividad.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
Con mi función de ayudante con la firma de private ListNode reverse(ListNode current)
.
Por el momento, lo tengo funcionando iterativamente usando una pila, pero esto no es lo que requiere la especificación. Encontré un algoritmo en C que lo invirtió de forma recursiva y lo convirtió a código Java a mano, y funcionó, pero no lo entendía.
Editar: No importa, lo descubrí mientras tanto.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Mientras estoy aquí, ¿alguien ve algún problema con esta ruta?
fuente
Respuestas:
Hay un código en una respuesta que lo explica, pero es posible que le resulte más fácil comenzar de abajo hacia arriba, haciendo y respondiendo preguntas pequeñas (este es el enfoque en The Little Lisper):
fuente
Me hicieron esta pregunta en una entrevista y me molestó que me equivocara con ella, ya que estaba un poco nervioso.
Esto debería invertir una lista enlazada individualmente, llamada con reverse (head, NULL); así que si esta fuera tu lista:
editar: he hecho como 6 ediciones en esto, mostrando que todavía es un poco complicado para mí lol
fuente
Llegué a la mitad (hasta nulo y un nodo como lo sugirió plinth), pero perdí la pista después de hacer una llamada recursiva. Sin embargo, después de leer la publicación por pedestal, esto es lo que se me ocurrió:
fuente
Aquí hay otra solución recursiva. Tiene menos código dentro de la función recursiva que algunos de los otros, por lo que podría ser un poco más rápido. Esto es C # pero creo que Java sería muy similar.
fuente
El algoritmo deberá funcionar en el siguiente modelo,
Estructura:
Código:
Salida:
fuente
Creo que esta es una solución más limpia, que se parece a LISP
fuente
Sé que esta es una publicación antigua, pero la mayoría de las respuestas no son recursivas, es decir, realizan algunas operaciones después de regresar de la llamada recursiva y, por lo tanto, no son las más eficientes.
Aquí hay una versión recursiva de cola:
Llamar con:
fuente
fuente
fuente
fuente
fuente
Invertir por algo recursivo.
Por iterativo
fuente
Esta solución demuestra que no se requieren argumentos.
Aquí está el código de apoyo, para demostrar que esto funciona:
fuente
Aquí hay un enfoque iterativo simple:
Y aquí hay un enfoque recursivo:
fuente
Como Java siempre se pasa por valor, para invertir de forma recursiva una lista enlazada en Java, asegúrese de devolver el "nuevo encabezado" (el nodo principal después de la reversión) al final de la recursividad.
fuente
PointZeroTwo tiene una respuesta elegante y lo mismo en Java ...
fuente
fuente
llamar usando: head = reverseRec (null, head);
fuente
Lo que hicieron otros chicos, en otra publicación es un juego de contenido, lo que hice es un juego de LinkedList, invierte el miembro de LinkedList, no invierte el valor de los miembros.
fuente
fuente
La solucion es:
}
fuente
fuente
fuente
fuente
fuente
Inspirado en un artículo que analiza implementaciones inmutables de estructuras de datos recursivas, puse una solución alternativa usando Swift.
La solución líder en documentos de respuesta al destacar los siguientes temas:
Los he mencionado donde corresponde en la siguiente solución.
fuente
Invertir la lista enlazada usando recursividad. La idea es ajustar los enlaces invirtiendo los enlaces.
fuente
fuente
fuente
Aquí hay una referencia si alguien está buscando una implementación de Scala:
fuente