141. Lista enlazada circular
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.
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.
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.
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,
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.
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;
}
}