我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置head,而快指针在位置head->next。如果在移动过程中,快指针反而追上慢指针,就说明该链表为环形链表,否则快指针将到达链表尾部,该链表不为环形链表。时间复杂度O(n),空间复杂度O(1)。
使用哈希表来存储所有已经访问过的节点。每次我们到达一个结点,如果该结点已经存在于哈希表中,则说明该链表是环形链表,否则就将该结点加入哈希表中。重复这一过程,直到我们遍历完整个链表。依托==unorder_set<>==容器,容器内存储的各个元素的值互不相等且不能改变,count()返回元素出现次数,insert()插入元素。时间复杂度O(n),空间复杂度O(n).
class Solution {
public:
bool hasCycle(ListNode *head) {
//方法一:双指针法,快慢指针,但快指针追上慢指针则表示存在环形链表,时间复杂度O(n),空间复杂度O(1)
if(0){
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;
}
//方法二:哈希表法,时间复杂度O(n),空间复杂度O(1)
else if(1){
//unordered_set<>为无序set容器;容器内部存储的各个元素的值都互不相等且不能改变;
unordered_set seen;
while(head!=nullptr){
//count()返回出现次数
if(seen.count(head)){
return true;
}
//insert()插入元素
seen.insert(head);
head=head->next;
}
return false;
}
}
};