Leetcode question 141-liste chaînée circulaire 1

Étant donné une liste liée, déterminez s'il y a un anneau dans la liste liée.

S'il y a un nœud dans la liste liée qui peut être atteint à nouveau en suivant en continu le pointeur suivant, alors il y a un anneau dans la liste liée. Afin de représenter les anneaux dans une liste chaînée donnée, nous utilisons l'entier pos pour indiquer la position où la fin de la liste chaînée est connectée à la liste chaînée (l'index commence à 0). Si pos vaut -1, il n'y a pas d'anneaux dans la liste chaînée. Remarque: pos n'est pas passé en paramètre, juste pour identifier la situation réelle de la liste chaînée.

S'il y a un anneau dans la liste chaînée, renvoie true. Sinon, il renvoie false.

Insérez la description de l'image ici
Insérez la description de l'image ici

Idées de résolution de problèmes:
1. Nous créons deux pointeurs: pointeur rapide rapide et pointeur lent lent.
2. Laissez le pointeur lent avancer une étape à la fois et le pointeur rapide deux étapes à la fois.

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

3. S'il y a une sonnerie, le pointeur rapide rattrapera le pointeur lent.

Code

/**
 * 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;
        
    }
};

Lorsque vous voyez cela, certaines personnes peuvent avoir des questions, pourquoi pouvez-vous rattraper rapidement le pointeur en deux étapes? Si vous faites 3 pas, 4 pas ou n pas, pouvez-vous rattraper?
Ma réponse est: 3 étapes, 4 étapes ou n étapes peuvent rattraper leur retard, mais elles peuvent ne pas rattraper leur retard et le cycle continuera.
Ensuite, analysons une onde:
Insérez la description de l'image ici
supposons que lorsque le pointeur lent entre dans la boucle, la distance entre rapide et lent est x ,
et à chaque fois que rapide et lent, la distance entre eux est réduite d'un pas.
Il devient x-1, x-2, x-3, ... jusqu'à ce que x soit réduit à 0 et se rencontre.

Si rapide prend 3 étapes, la distance x est
x-2, x-4, ...
Lorsque x est un nombre impair, rapide sautera lentement et ne se rencontrera pas. Après avoir sauté, l'écart est toujours étrange, ce qui entraînera une boucle sans fin.
C'est similaire à la marche de N pas, mais aussi une boucle sans fin.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_50843868/article/details/111703821
conseillé
Classement