Introducci贸n

1

驴Ya tomaste el Curso Avanzado de Algoritmos: Patrones de Arrays y Strings?

Lista Enlazada

2

Estructura de datos: Lista Enlazada

3

Programando listas enlazadas con Java

4

C贸mo Invertir una Lista Enlazada

5

Odd Even Linked List: an谩lisis del problema

6

Soluci贸n de Odd Even Linked List

7

Playground: Odd Even Liked List

8

Programando Odd Even Linked List con C++

9

Linked List Cycle: an谩lisis del problema

10

Soluci贸n de Linked List Cycle

11

Playground: Linked List Cycle

12

Programando Linked List Cycle con Python

13

Palindrome Linked List: an谩lisis del problema

14

Soluci贸n de Palindrome Linked List

15

Playground: Palindrome Linked List

16

Programando Palindrome Linked List con Java

17

Reorder List: an谩lisis del problema

18

Soluci贸n de Reorder List

19

Programando Reorder List con JavaScript

20

Playground: Reorder List Without Repeated Values

21

Reto: LRU Cach茅

22

Ejercicios recomendados de Lista Enlazada

23

Ejercicios resueltos de Lista Enlazada

Pilas y colas

24

Estructura de datos: Pilas y Colas

25

Par茅ntesis V谩lido: an谩lisis del problema

26

Soluci贸n de Par茅ntesis V谩lido

27

Playground: Par茅ntesis V谩lido

28

Programando Par茅ntesis V谩lido con C++

29

Ejercicios recomendados de Pilas

Colas de prioridad

30

Estructura de datos: Colas de Prioridad

31

K Closest Points to Origin: an谩lisis del problema

32

Soluci贸n de K Closest Points to Origin

33

Playground: K Closest Points to Origin

34

Programando K Closest Points to Origin con Python

35

Reorganize String: an谩lisis del problema

36

Soluci贸n de Reorganize String

37

Playground: Reorganize String

38

Programando Reorganize String con Python

39

Ejercicios recomendados de Colas de prioridad

40

Ejercicios resueltos de Colas de prioridad

Pr贸ximos pasos

41

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

Aprovecha el precio especial y haz tu profesi贸n a prueba de IA

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

2 D铆as
5 Hrs
29 Min
44 Seg

Programando Palindrome Linked List con Java

16/41
Resources

Contributions 9

Questions 1

Sort by:

Want to see more contributions, questions and answers from the community?

La profe tuvo un error en la l铆nea 11 al pasar el par谩metro para la funci贸n de reversar porque se debe reversar es a partir de la segunda mitad, es decir quedar铆a algo as铆: "Nodo comienzoSegundaMitad = reversarLista(finPrimeraMitad.siguiente)".

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

Un resultado similar se puede alcanzar utilizando una Queue y un Stack. Se recorre la lista enlazada O(n) y se almacenan los valores, uno por uno, en el Stack y en la Queue, luego, se recorren al tiempo comparando los valores. No obstante, este procedimiento ocupa un espacio auxiliar de O(n+n) de las otras estructuras. El algortimo que se propone en esta clase tiene la ventaja de ser "in-place", por lo que no requirre de m谩s espacio temporal, sin embargo, hay algunos errores en la implementaci贸n, se pueden corregir facilmente con: Cambiar `Nodo comienzoSegundaMitad = reversarLista(cabeza);` Por: `Nodo comienzoSegundaMitad = reversarLista(finPrimeraMitad.siguiente);` En `public Nodo reversarLista(Nodo cabeza);` Retornar `return anterior;`
My solution!! ![](https://static.platzi.com/media/user_upload/image-5b269f6d-c245-4c84-8d3e-53336dcebbd8.jpg)

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));