# 环形链表
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true
。 否则,返回 false
。
进阶:
你能用 O(1)(即,常量)内存解决此问题吗?
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
提示:
- 链表中节点的数目范围是
[0, 104]
-105 <= Node.val <= 105
pos
为 -1
或者链表中的一个 有效索引 。
以下错误的选项是?
## aop
### before
```cpp
#include
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
```
### after
```cpp
```
## 答案
```cpp
class Solution
{
public:
bool hasCycle(ListNode *head)
{
ListNode *low = head;
ListNode *quick = head;
while (low && quick && quick->next)
{
low = low->next;
quick = quick->next;
if (low == quick)
{
return true;
}
}
return false;
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
bool hasCycle(ListNode *head)
{
ListNode *q = head;
while (q)
{
if (q->visit == true)
return true;
else
q->visit = true;
}
return false;
}
};
```
### B
```cpp
class Solution
{
public:
bool hasCycle(ListNode *head)
{
if (head == NULL || head->next == NULL)
return false;
ListNode *k = head;
ListNode *q = head->next;
int count = 0;
while (q)
{
for (int i = count; i > 0; i--)
{
k = k->next;
if (k == q)
return true;
}
k = head;
q = q->next;
count++;
}
return false;
}
};
```
### C
```cpp
class Solution
{
public:
bool hasCycle(ListNode *head)
{
if (head == NULL || head->next == NULL)
return false;
ListNode *Snode = head;
ListNode *Fnode = head->next;
while (Snode != Fnode)
{
if (Fnode == NULL || Fnode->next == NULL)
{
return false;
}
Snode = Snode->next;
Fnode = Fnode->next->next;
}
return true;
}
};
```