Introducci贸n
驴Ya tomaste el Curso Avanzado de Algoritmos: Patrones de Arrays y Strings?
Lista Enlazada
Estructura de datos: Lista Enlazada
Programando listas enlazadas con Java
C贸mo Invertir una Lista Enlazada
Odd Even Linked List: an谩lisis del problema
Soluci贸n de Odd Even Linked List
Playground: Odd Even Liked List
Programando Odd Even Linked List con C++
Linked List Cycle: an谩lisis del problema
Soluci贸n de Linked List Cycle
Playground: Linked List Cycle
Programando Linked List Cycle con Python
Palindrome Linked List: an谩lisis del problema
Soluci贸n de Palindrome Linked List
Playground: Palindrome Linked List
Programando Palindrome Linked List con Java
Reorder List: an谩lisis del problema
Soluci贸n de Reorder List
Programando Reorder List con JavaScript
Playground: Reorder List Without Repeated Values
Reto: LRU Cach茅
Ejercicios recomendados de Lista Enlazada
Ejercicios resueltos de Lista Enlazada
Pilas y colas
Estructura de datos: Pilas y Colas
Par茅ntesis V谩lido: an谩lisis del problema
Soluci贸n de Par茅ntesis V谩lido
Playground: Par茅ntesis V谩lido
Programando Par茅ntesis V谩lido con C++
Ejercicios recomendados de Pilas
Colas de prioridad
Estructura de datos: Colas de Prioridad
K Closest Points to Origin: an谩lisis del problema
Soluci贸n de K Closest Points to Origin
Playground: K Closest Points to Origin
Programando K Closest Points to Origin con Python
Reorganize String: an谩lisis del problema
Soluci贸n de Reorganize String
Playground: Reorganize String
Programando Reorganize String con Python
Ejercicios recomendados de Colas de prioridad
Ejercicios resueltos de Colas de prioridad
Pr贸ximos pasos
Toma el Curso Avanzado de Algoritmos: Grafos y 脕rboles
You don't have access to this class
Keep learning! Join and start boosting your career
Contributions 9
Questions 1
En javascript:
con el puntero lento voy guardando los valores en una pila/stack
cuando llego a la mitad hay dos casos, que sea par o impar.
si es par, el lento avanza 1 y si es par el lento avanza 2 para comenzar a comparar los valores de la pila.
recorro lo que queda de lista sacando los valores de la pila.
devuelve falso si los valores son distintos, o si quedan elementos en la pila.
devuelve verdadero de lo contrario
function isPalindrome(cabeza) {
if ( cabeza === null ||
cabeza.siguiente === null ||
cabeza.siguiente.siguiente === null) {
return True;
}
let stack = [];
stack.push(cabeza.valor);
let lento = cabeza;
let rapido = cabeza.siguiente.siguiente;
while (rapido != null &&
rapido.siguiente != null) {
rapido = rapido.siguiente.siguiente;
lento = lento.siguiente;
stack.push(lento.valor);
}
if (rapido == null) {
console.log("even list");
lento = lento.siguiente
}
else {
console.log("odd list");
lento = lento.siguiente.siguiente;
}
while (lento != null){
if (lento.valor != stack.pop())
return false;
lento = lento.siguiente;
}
if (stack.length != 0){
return false;
}
return true;
}
codigo para probar
//a b c b a
const nodo1 = new Nodo("a");
const nodo2 = new Nodo("b");
const nodo3 = new Nodo("c");
const nodo4 = new Nodo("b");
const nodo5 = new Nodo("a");
nodo1.siguiente = nodo2;
nodo2.siguiente = nodo3;
nodo3.siguiente = nodo4;
nodo4.siguiente = nodo5;
console.log(isPalindrome(nodo1));
// a b b a
const node1 = new Nodo("a");
const node2 = new Nodo("b");
const node3 = new Nodo("b");
const node4 = new Nodo("a");
node1.siguiente = node2;
node2.siguiente = node3;
node3.siguiente = node4;
console.log(isPalindrome(node1));
simplemente por legibilidad espalindromo lo convertiria en una funcion
Ejecuci贸n con C++
template<class T>
bool Lista<T>::Palindrome() {
// Defino mis punteros din谩micos
Nodo<T> *lento = inicio;
Nodo<T> *rapido = inicio;
Nodo<T> *anterior = nullptr;
Nodo<T> *actual = nullptr;
Nodo<T> *medio = nullptr;
Nodo<T> *auxiliar = nullptr;
if (inicio == nullptr) {
throw 404; // Lista vac铆a
}
// Mover los punteros lento y r谩pido
while (rapido != nullptr && rapido->getSiguiente() != nullptr) {
rapido = rapido->getSiguiente()->getSiguiente();
anterior = lento;
lento = lento->getSiguiente();
}
// Si rapido no es nulo, la lista tiene un n煤mero impar de elementos, avanzar lento
if (rapido != nullptr) {
lento = lento->getSiguiente();
}
// Invertir la segunda mitad de la lista
actual = lento;
anterior = nullptr;
while (actual != nullptr) {
auxiliar = actual->getSiguiente();
actual->setSiguiente(anterior);
anterior = actual;
actual = auxiliar;
}
// Comparar la primera mitad con la segunda mitad invertida
medio = anterior;
actual = inicio;
while (medio != nullptr) {
if (medio->getDato() != actual->getDato()) {
return false; // No es un pal铆ndromo
}
medio = medio->getSiguiente();
actual = actual->getSiguiente();
}
return true; // Es un pal铆ndromo
}
Inmutabilidad!!!
En Python.
Me faltaba el guardar la Lista inicial, cre铆 que no se modificaba, pero al imprimir, efectivamente s铆.
.
Una opci贸n y sencilla es import copy
y usar copy.deepcopy(cabeza)
para que esta sea la que se cambie y no la original.
.
O otra opci贸n:
def copyList(cabeza):
if cabeza is None:
return None
copia = Nodo(cabeza.valor)
copia.siguiente = copyList(cabeza.siguiente)
return copia
.
Por cierto, el c贸digo de los recursos est谩 un poco diferente al de la clase. Pero creo que es solo el return de la function reversarLista
en la clase esta como anterior, y en el archivo como actual. Y seg煤n la implementaci贸n de clases pasadas si es anteror
.
Mi soluci贸n en JS.
Tomar en cuenta que aqu铆 se esta creando tanto la clase Nodo, como la clase LinkedList y adem谩s unas funciones de utiler铆a para poder acceder a cada uno de los Nodos despu茅s de haber creado la LinkedList.
function forEachNode(linkedList, callback) {
let current = linkedList.head;
callback(current);
while (current.next) {
current = current.next;
callback(current);
}
}
class Node {
constructor(element) {
this.element = element;
this.next = null;
}
}
class LinkedList {
constructor(...items) {
this.head = null;
items.forEach((item) => this.add(new Node(item)));
}
add(node) {
if (!this.head) {
this.head = node;
} else {
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = node;
}
}
}
function isLinkedLinkPalindrome(linkedList) {
let shortPointer = linkedList.head;
let largePointer = linkedList.head;
const firstHalf = [shortPointer.element];
while (largePointer.next && largePointer.next.next) {
firstHalf.unshift(shortPointer.next.element);
shortPointer = shortPointer.next;
largePointer = largePointer.next.next;
}
let currentComparisonItem;
if (!largePointer.next) { // linkedList is odd
currentComparisonItem = shortPointer;
} else { // linkedList is even
currentComparisonItem = shortPointer.next;
}
let counter = 0;
while (currentComparisonItem) {
if (firstHalf[counter] !== currentComparisonItem.element) return false;
counter++;
currentComparisonItem = currentComparisonItem.next;
}
return true;
}
const myLinkedList = new LinkedList(6,5,4,4,5,6);
console.log(isLinkedLinkPalindrome(myLinkedList));
Want to see more contributions, questions and answers from the community?