【练习】【链表】力扣热题100 141. 环形链表
题目
- 环形链表
来源:力扣热题100 141. 环形链表
思路(注意事项)
快慢指针。
纯代码
/**
* 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 *p = head -> next, *q = p -> next;
while (p != q && q != nullptr)
{
p = p -> next;
q = q -> next;
if (q != nullptr) q = q -> next;
}
if (q == p) return true;
else return false;
}
};
题解(加注释)
/**
* 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) {
// 如果链表为空或只有一个节点,直接返回 false
if (head == nullptr || head -> next == nullptr) return false;
// 定义两个指针 p 和 q,分别指向 head 的下一个节点和下下个节点
ListNode *p = head -> next, *q = p -> next;
// 使用快慢指针法遍历链表
while (p != q && q != nullptr)
{
p = p -> next; // 慢指针 p 每次走一步
q = q -> next; // 快指针 q 每次走两步
if (q != nullptr) q = q -> next;
}
// 如果 p 和 q 相遇,说明链表有环
if (q == p) return true;
// 否则,链表无环
else return false;
}
};