给你一个链表的头节点 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;
}
};
标签:head,ListNode,141,环形,fast,next,链表,指针
From: https://www.cnblogs.com/owmt/p/17908912.html