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 Prácticos con Listas Enlazadas y Historial de Navegador

23

Operaciones con Listas Enlazadas: Suma, Intercambio y Navegador

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

Comparación de Cadenas con Backspaces

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

Colas de Prioridad: Ejercicios Prácticos y Soluciones

40

Colas de Prioridad y Gestión de Eventos

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

Programando Linked List Cycle con Python

12/41
Recursos

Aportes 6

Preguntas 0

Ordenar por:

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

En el código de la profe solo hay un error en la línea 6 donde se indica el tipo de dato ya que es de tipo "Nodo" debido que la función recibe como parámetro el primer nodo de la lista. Y además como la función está fuera de la clase, no se debe incluir el parámetro "self": ![](https://static.platzi.com/media/user_upload/imagen-17c0485a-5829-4da1-83f1-f64d676c8705.jpg)
My Solution!! ![](https://static.platzi.com/media/user_upload/image-88e2264e-1fa2-49ca-9c85-b34b3c9d9671.jpg)
esta es mi solución en java: ```java public boolean hasCycle (Nodo cabeza){ boolean boolHasCycle = true; //voy a asumir que cada nodo tiene un único valor //entonces al comparar si ya se pasó por ese nodo compararé los valores que tienen dentro if(cabeza == null || cabeza.siguiente == null){ return false; } Nodo apuntadorRapido = cabeza; Nodo apuntadorLento = cabeza; while (boolHasCycle) { if (apuntadorLento.siguiente != null){ apuntadorLento = apuntadorLento.siguiente; } //este lo hago por si algo, pero en mi mente va a llegar siempre el rápido primero a null, en caso de existir un final else { boolHasCycle = false; } if (apuntadorRapido.siguiente != null) { if(apuntadorRapido.siguiente.siguiente != null){ apuntadorRapido = apuntadorRapido.siguiente.siguiente; } else { boolHasCycle = false; } } else { boolHasCycle = false; } if(apuntadorRapido.valor == apuntadorLento.valor){ break; } } return boolHasCycle; } ```
En TypeScript: ```js /** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ function hasCycle(head: ListNode | null): boolean { if (head == null) { return false } let p1 = head; let p2 = head.next; // Fast pointer while (p1 != p2) { if (!p2 || !p2.next) { return false; } p1 = p1.next; p2 = p2.next.next; } return true; }; ```/\*\* \* Definition for singly-linked list. \* class ListNode { \* val: number \* next: ListNode | null \* constructor(val?: number, next?: ListNode | null) { \* this.val = (val===undefined ? 0 : val) \* this.next = (next===undefined ? null : next) \* } \* } \*/ function hasCycle(head: ListNode | null): boolean { if (head == null) { return false } let p1 = head; let p2 = head.next; // Fast pointer while (p1 != p2) { if (!p2 || !p2.next) { return false; } p1 = p1.next; p2 = p2.next.next; } return true; };

Lo había pensado como en la segundo versión de la profe pero agregue en el if que si lento estaba después de rápido arrojara true. Dejo mi ejecución en c++

template<class T> bool Lista<T>::hasCycle(){
    Nodo<T> *rapido=inicio;
    Nodo<T> *lento=inicio;

    if (inicio== nullptr){
        throw 404;
    }

    if (inicio->getSiguiente()== nullptr){
        return false;
    }

    while (rapido->getSiguiente()!= nullptr || rapido== nullptr){

        if (rapido->getSiguiente()==lento || rapido==lento){
            //hay algun ciclo
            return true;
        }

        lento=lento->getSiguiente();
        rapido=rapido->getSiguiente()->getSiguiente();
    }

    return false;
}

Me da curiosidad que dijo que lento y rápido iniciaban en el mismo, pero en la implementación no, aun así, ayudo bastante afianzar Linked List.