Pregunta de Leetcode 141-lista enlazada circular 1

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 volver a acceder mediante el seguimiento continuo del siguiente puntero, entonces 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, no hay anillos 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í
Inserte la descripción de la imagen aquí

Ideas de resolución de problemas:
1. Creamos dos punteros: puntero rápido rápido y puntero lento lento.
2. Deje que el puntero lento avance paso a paso y el puntero rápido dos pasos a la vez.

slow = slow->next;
fast = fast->next->next;

3. Si hay un anillo, el puntero rápido se pondrá al día con el puntero lento.

Código

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    
    
public:
    bool hasCycle(ListNode *head) {
    
    
        //设置快慢指针slow,fast
        ListNode* slow = head,*fast = head;

        while(fast && fast->next)
        {
    
    
            slow = slow->next;//慢指针每次走一步
            fast = fast->next->next;//快指针每次走俩步

            if(fast == slow)
            {
    
    
                return true;
            }
        }

        return false;
        
    }
};

Cuando vea esto, algunas personas pueden tener preguntas, ¿por qué puede ponerse al día con el puntero dos pasos rápidamente? Si das 3 pasos, 4 pasos on n pasos, ¿puedes ponerte al día?
Mi respuesta es: 3 pasos, 4 pasos on n pasos pueden ponerse al día, pero es posible que no se pongan al día y el ciclo continuará.
A continuación, analicemos una onda:
Inserte la descripción de la imagen aquí
supongamos que cuando el puntero lento entra en el bucle, la distancia entre rápido y lento es x ,
y cada vez que avanza rápido y lento, la distancia entre ellos se reduce en un paso.
Se convierte en x-1, x-2, x-3, ... hasta que x se reduce a 0 y se encuentra.

Si rápido da 3 pasos, la distancia x es
x-2, x-4, ...
Cuando x es un número impar, rápido saltará lento y no se encontrará. Después de saltar, el espacio sigue siendo extraño, lo que provocará un bucle sin fin.
Es similar a caminar N pasos, pero también un bucle sin fin.

Supongo que te gusta

Origin blog.csdn.net/weixin_50843868/article/details/111703821
Recomendado
Clasificación