141.环形链表

发布时间 2023-12-17 12:09:29作者: owmt

给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。



示例

输入: head = [3,2,0,-4];
输出:true


思路:

循环遍历链表,检查是否存在重复的节点,可以使用哈希表存储已访问过的节点,时间和空间复杂度为O(n)。
还有一种是使用龟兔赛跑算法(Floyd判圈算法),使用两个指针,一个快指针一个慢指针。快指针移动两步,慢指针移动一步。如果链表存在环,快指针会追上慢指针。

代码:

/**
 * 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) {
        if(head == nullptr || head->next == nullptr)
            return false;
        ListNode* slow = head;
        ListNode* fast = head->next;
        while(slow != fast){
            if(fast == nullptr || fast->next == nullptr)
                return false;
            slow = slow->next;
            fast = fast->next->next;
        }
        return true;
    }
};