给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
方法一:双指针法
一快一慢,两个指针。如果有环的话,那么最终快慢指针会相遇。即如果两个指针不相等,那么都继续前进,除非快指针到头了则返回false,否则都是继续前进
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL || head->next == NULL) return false;
ListNode* slow = head;
ListNode* fast = head->next;
while(slow != fast){
if(fast == NULL || fast->next == NULL) return false;
slow = slow->next;
fast = fast->next->next;
}
return true;
}
};
方法二:哈希表
检查是否有环,可以检查节点是否被访问过。用map记录节点访问的次数
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == nullptr || head->next == nullptr) return false;
map<ListNode*, int> ptrArr;
ptrArr[head] = 1;
while(head)
{
head = head->next;
if(ptrArr.count(head) == 1)
{
return true;
}
else
{
ptrArr[head] = 1;
}
}
return false;
}
};