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

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Cómo Invertir una Lista Enlazada

4/41
Recursos

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La solución de la profe en Java, reverseLinkedList método que va en la clase ListaEnlazada realizada en la sección previa, Java no permite la asignación paralela como en Python, por lo cual se usa la variable temp:

    public void reverseLinkedList() { 
        Nodo anterior = null;
        Nodo temp = null;
        Nodo cabezaInicial = this.cabeza;
        Nodo colaInicial = this.cola;
        
        while (this.cabeza != null) {
            temp = this.cabeza.siguiente; // Guardamos el Nodo cabeza.siguiente 
            this.cabeza.siguiente = anterior;	
            
            if ((this.cabeza.equals(colaInicial))) {
                /*
                 * Cuando llegamos al útlimo Nodo de la lista, que ahora es cabeza,
                 * al Nodo cola le asignamos el Nodo cabeza inicial, es decir
                 * al Nodo cola le asignamos el Nodo con el cual se inició el recorrido del while.
                 */
                this.cola = cabezaInicial;
                break;
            }
            
            anterior = this.cabeza;
            this.cabeza = temp;
        } 
    }

Cuando llegamos al último Nodo de la lista, se rompe el while antes de anterior = this.cabeza; this.cabeza = temp;, para que Nodo cabeza no apunte a null y para no hacer una asignación demás a Nodo anterior.

Codigo en TS: ```js function reverseList(head: ListNode | null): ListNode | null { let [p1, p2] = [head, null]; while (p1 != null) { p2 = new ListNode(p1.val, p2); p1 = p1.next; } return p2; }; ```function reverseList(head: ListNode | null): ListNode | null { let \[p1, p2] = \[head, null]; while (p1 != null) { p2 = new ListNode(p1.val, p2); p1 = p1.next; } return p2;};
```python class Node: def __init__(self, data): self.data = data self.next = None self.prev = None def __str__(self): return str(self.data) class Lista: def __init__(self): self.head, self.tail= None, None def __len__(self): length = 0 current = self.head while current: length += 1 current = current.next return length def append(self, data): new_node = Node(data) if self.head is None: self.head = new_node else: self.tail.next = new_node # Update the next pointer of the current tail node self.tail = new_node # Update the tail attribute to point to the new node return f'{data} has been added' def __str__(self): result = [] current = self.head while current: result.append(str(current)) current = current.next return ' -> '.join(result) + f', tail => {self.tail}' # Add tail information to the string representation def reverse(self): current = self.head previous = None while current != None: current.next, previous, current = previous, current, current.next self.head = previous return previous # Example usage: my_list = Lista() my_list.append(1) my_list.append(2) my_list.append(3) my_list.append(4) my_list.append(30) print(my_list) my_list.reverse() print(my_list) ```output  1 -> 2 -> 3 -> 4 -> 30, tail => 30 30 -> 4 -> 3 -> 2 -> 1, tail => 30
```python class Node: def __init__(self, data): self.data = data self.next = None self.prev = None def __str__(self): return str(self.data) class Lista: def __init__(self): self.head, self.tail= None, None def __len__(self): length = 0 current = self.head while current: length += 1 current = current.next return length def append(self, data): new_node = Node(data) if self.head is None: self.head = new_node else: self.tail.next = new_node # Update the next pointer of the current tail node self.tail = new_node # Update the tail attribute to point to the new node return f'{data} has been added' def __str__(self): result = [] current = self.head while current: result.append(str(current)) current = current.next return ' -> '.join(result) + f', tail => {self.tail}' # Add tail information to the string representation def reverse(self): current = self.head previous = None while current != None: current.next, previous, current = previous, current, current.next self.head = previous return previous # Example usage: my_list = Lista() my_list.append(1) my_list.append(2) my_list.append(3) my_list.append(4) my_list.append(30) print(my_list) my_list.reverse() print(my_list) ```class Node:    def \_\_init\_\_(self, data):        self.data = data        self.next = None        self.prev = None     def \_\_str\_\_(self):        return str(self.data) class Lista:     def \_\_init\_\_(self):        self.head, self.tail= None, None     def \_\_len\_\_(self):        length = 0        current = self.head        while current:            length += 1             current = current.next        return length        def append(self, data):        new\_node = Node(data)        if self.head is None:            self.head = new\_node        else:            self.tail.next = new\_node  # Update the next pointer of the current tail node        self.tail = new\_node  # Update the tail attribute to point to the new node        return f'{data} has been added'        def \_\_str\_\_(self):        result = \[]        current = self.head        while current:            result.append(str(current))            current = current.next         return ' -> '.join(result) + f', tail => {self.tail}'  # Add tail information to the string representation        def reverse(self):        current = self.head        previous = None        while current != None:            current.next, previous, current = previous, current, current.next        self.head = previous        return previous    # Example usage:my\_list = Lista()my\_list.append(1)my\_list.append(2) my\_list.append(3)my\_list.append(4) my\_list.append(30)print(my\_list) my\_list.reverse()print(my\_list)

Hice la prueba con el codigo de la profe, y solo devolvia el primer nodo, toca quitarle el return y agregarle el cambio de cabeza con la cola:
self.head, self.tail = self.tail, self.head
.
comparto código con pruebas


.
Pruebas:

Otra solución:
Con Java, método dentro de la clase ListaEnlazada.

Mover el nodo cabeza y colocarlo entre el nodo cola y lo que apuntaba el nodo cola (esto se almacena en la aux para no perder esa parte de la lista). El nodo cola siempre será el mismo durante toda el recorrido del while hasta que éste se convierta en actual y sea el primero de la lista y se lo asignemos a la cabeza.

Ej.: 1 -> 2 -> 3 -> 4

  1. Primera iteración: Movemos el 1 entre 4 y el null
    2 -> 3 -> 4 -> 1

  2. Segunda iteración. Movemos el 2 entre el 4 y el 1
    3 -> 4 -> 2 -> 1

  3. Tercera iteración: Movemos el 3 entre el 4 y el 2
    4 -> 3 -> 2 ->1

Como actual = 4 y es igual al Nodo colaInicial rompemos el ciclo y nuestra lista estará reversada.

    public void reversarListaEnlazada() {
        
        Nodo colaInicial = this.cola;          //Guardamos el Nodo cola inicial
        Nodo cabezaInicial = this.cabeza;      //Guardamos el Nodo cabeza inicial
        Nodo actual = this.cabeza;
        Nodo aux = null;
        
        while (actual.siguiente != null) {
            if (actual.equals(colaInicial)) {    
                /*
                 * Si el nodo actual es igual al Nodo colaInicial,
                 * cambiamos por primera vez el puntero del nodo cola,
                 * y se lo asignamos al Nodo cabezaInicial.
                 */
                this.cola = cabezaInicial;
                break;
            } 
            actual = actual.siguiente;
            aux = this.cola.siguiente;
            this.cola.siguiente = this.cabeza;
            this.cabeza.siguiente = aux;
            this.cabeza = actual;
        }
    }