Reloj Li Buckle-141. Ring Link

tema:

Dada una lista vinculada, determine si hay un anillo en la lista vinculada.

Si hay un nodo en la lista vinculada al que se puede acceder de nuevo mediante el seguimiento continuo del siguiente puntero, hay un anillo en la lista vinculada. Para representar los anillos en una lista vinculada dada, usamos el entero pos para indicar la posición donde el final de la lista vinculada está conectado a la lista vinculada (el índice comienza desde 0). Si pos es -1, entonces no hay ningún anillo en la lista vinculada. Nota: pos no se pasa como parámetro, solo para identificar la situación real de la lista enlazada.

Si hay un anillo en la lista vinculada, devuelve verdadero. De lo contrario, devuelve falso.

Inserte la descripción de la imagen aquí

Entrada: cabeza = [3,2,0, -4], pos = 1
Salida: verdadera
Explicación: Hay un anillo en la lista vinculada y su cola está conectada al segundo nodo.

Inserte la descripción de la imagen aquí

Entrada: cabeza = [1,2], pos = 0
Salida: verdadera
Explicación: Hay un anillo en la lista vinculada y su cola está conectada al primer nodo.

Inserte la descripción de la imagen aquí

Entrada: cabeza = [1], pos = -1
Salida: falso
Explicación: No hay ningún anillo en la lista enlazada.


Idea 1: tabla hash

Solo necesitamos recorrer toda la lista vinculada por turno y crear una tabla hash para almacenar los nodos atravesados,

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Cuando el nodo a almacenar ya existe en la tabla hash, significa que la lista vinculada tiene un anillo y el recorrido finaliza.

public class Solution {
    
    
    public boolean hasCycle(ListNode head) {
    
    
        HashSet<ListNode> hashSet = new HashSet<ListNode>();
        //遍历链表
        while(head != null){
    
    
            if(!hashSet.add(head)){
    
    
                return true;
            }
            head = head.next;
        }
        return false;
    }
}

Idea 2: punteros rápidos y lentos

Idea: Defina dos punteros, un puntero lento lento y un puntero rápido rápido. Al principio, tanto el puntero rápido como el puntero lento apuntan a la cabeza. Utilice el bucle do while para realizar primero una operación de movimiento del puntero, porque la condición del juicio del bucle es lenta. = rápido.

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

public class Solution {
    
    
    public boolean hasCycle(ListNode head) {
    
    
        if(head == null ){
    
    
            return false;
        }
        //快指针和慢指针
        ListNode fast = head ,slow = head;
        do{
    
    
        	//如果没有环fast会先移动到null或者第二个就是null
            if(fast == null || fast.next == null){
    
    
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }while(fast != slow);
        return true;
    }
}

Supongo que te gusta

Origin blog.csdn.net/mjh1667002013/article/details/114413421
Recomendado
Clasificación