¿Cómo podemos verificar de forma recursiva si una lista vinculada individualmente es un palíndromo?

El primer método nos dice que almacenemos los elementos en la pila y los elementos emergentes de la pila uno por uno y verifiquemos desde el elemento actual. El método 3 es en realidad el mismo, pero usa la pila del compilador. cuando se llama a una función recursiva, se almacena en la propia pila del compilador. Este método explota la misma propiedad. Es por eso que la mayoría de las funciones recursivas son convertibles en funciones iterativas usando una pila.

Entonces, enviaremos dos punteros, el primero y el último. (inicialmente head) y last se actualizarán a last.next en cada llamada recursiva y no actualizaremos la primera. eventualmente, en el elemento superior de la pila (obviamente del compilador), last apuntará al último elemento de la lista enlazada y primero apuntará al encabezado de la lista enlazada. En ese momento, compararemos el primero y el último, si no son iguales, entonces devolveremos falso a cada elemento de la pila del compilador debajo de este elemento. Pero, si son iguales, avanzaremos primero (que es una variable global y se puede actualizar desde cualquier lugar) y la función volverá. Cuando la función regrese al siguiente elemento (parte inferior de ese), primero apuntará al siguiente de la cabeza y el último apuntará al anterior desde la cola y así sucesivamente. Se vería un código simple y autoexplicativo en Java.

// x es una variable global, siempre que un elemento de la pila (llamada recursiva) sea falso,
// devolveremos falso a cada elemento más inferior.
booleano x = verdadero;

// primero = cabeza, última = cabeza, inicialmente
boolean isPalindrome (nodo primero, nodo último)
{
// cada vez que llegue al final de la lista vinculada, devolveremos verdadero.
if (último == nulo)
volver verdadero;

// en cada llamada recursiva, no modificaremos primero, pero modificaremos el último.
x = isPalindrome (primero, último.siguiente);

// recuerde, cuando un elemento de la pila devuelve falso, devolveremos falso a cada elemento más inferior.
si (! x) devuelve falso;

// si x es verdadero, revisaremos la siguiente entrada.
booleano y = falso;
if (first.data == last.data)
{
y = verdadero;
}

// avanza primero antes de regresar del elemento actual de la pila.
primero = primero.siguiente;
volver y;
}

Gracias A2A, Lehar Bhandari.

Similar a la primera solución, pero la idea es avanzar hasta pasar el final de la lista. Luego retroceda capa por capa, de modo que la pila del programa seleccione automáticamente el nodo posterior correspondiente para la comparación. Espero eso ayude

/ **

* Definición de lista individualmente vinculada.

* struct ListNode {

* int val;

* ListNode * next;

* ListNode (int x): val (x), next (NULL) {}

*};

* /

Solución de clase {

público:

bool isPalindrome (ListNode * head) {

if (! head ||! head-> next) devuelve verdadero;

frente = cabeza;

resultado bool = verdadero;

partido (cabeza, resultado);

resultado de retorno;

}

privado:

anular la coincidencia (ListNode * back, bool & res) {

if (! back) return; // avanza hasta pasar el final, luego retrocede

match (back-> next, res); // llamando a la siguiente capa de nodo

if (! res) return;

// punto de salida de la última llamada, regresa directamente una vez que ocurre un par de desajustes

if (front-> val! = back-> val) {res = false; regreso;}

front = front-> next; // actualiza el nodo frontal para la próxima coincidencia

}

ListNode * front;

};

More Interesting

¿Dejarías que los algoritmos se intercambiaran por ti cuando estés en el trabajo?

¿En qué punto Watson podrá crear sus propios algoritmos?

¿Por qué muchos elementos utilizados en la función objetivo de un algoritmo de aprendizaje asumen todas las características centradas en cero y tienen una varianza en el mismo orden?

Después de que termina el programa de programación (estructuras de datos y algoritmo), ¿qué se les enseña a los estudiantes en CSE después de eso?

¿Dónde puedo encontrar un algoritmo de relevancia marginal máxima en Python para la eliminación de redundancia en dos documentos?

Cómo construir un algoritmo automatizado de comercio de acciones utilizando mis estrategias sin tener que contratar un programador

¿Cuál ha sido la experiencia general con el producto de optimización creativa dinámica (DCO) de Tumri?

¿Puedes predecir la lotería con algoritmo?

¿Cuál es la forma más eficiente de implementar la unión en varias tablas (> 5 tablas) usando SQL / ANSI SQL?

¿Es válido este intento recursivo de bubbleort o se puede optimizar?

¿Qué es un algoritmo de descubrimiento de ruta de ataque cibernético?

Cómo usar el 'mapa combinatorio' de una triangulación de un polígono 2D para probar si un borde dado de la triangulación es un borde límite

¿Alguna vez has usado los algoritmos que has aprendido en la universidad?

¿Qué es la clasificación interna y la clasificación externa?

¿Cómo explicaría los algoritmos gráficos en términos simples?