题目描述:给定一个链表,判断链表中是否有环;并给出环链接的位置
知识点
操作链表节点的知识点;哈希表和双指针;
解题思路
法一:哈希表
由定义可知环形链表就是两个节点中的next指向同一个节点。所以可以遍历链表,将节点的地址存入一个哈希表中;
如果遍历过程中节点的next为空,这说明不是环形链表;
如果遍历过程中,某节点的地址值在哈希表中已存在,就说明是;
法二:双指针法
快慢两个指针,当两个指针相遇,说明有环,返回True;
代码实现
双指针法:
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* p1 = head;
ListNode* p2 = head;
while(p2 && p2->next)
{
p1 = p1->next;
p2 = p2->next->next;
if(p1 == p2)
return true;
}
return false;
}
};
哈希表法
class Solution {
public:
bool hasCycle(ListNode *head) {
set<ListNode*> s; // 这点不知道是什么意思
ListNode* ptr=head;
while (ptr) {
if (s.find(ptr) != s.end()) {
return true;
} else {
s.insert(ptr);
head = head->next;
}
}
return false;
}
};