题目描述:给你一个链表的头节点 head ,判断链表中是否有环。

方法1:慢指针每次移动一步,快指针每次移动两步,如果有环最后一定会相遇

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head || !head->next) return false; //处理没有节点或者只有一个节点,注意是非
        ListNode *p = head;//快指针
        ListNode *q = head;//慢指针
        while(p && p->next){//无环时,奇数个节点,p为空,偶数个节点,p->next为空
            p = p->next->next;
            q = q->next;
            if(p == q) return true;
        }
        return false;
    }
};

方法2:使用unordered_set

class Solution {
public:
    bool hasCycle(ListNode *head) {
        unordered_set<ListNode*> set;
        while(head){
            if(set.count(head)) return true;
            set.emplace(head);
            head = head->next;
        }
        return false;
    }
};