环形链表


环形链表

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
给你一个链表的头节点 head ,判断链表中是否有环
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)注意:pos 不作为参数进行传递 仅仅是为了标识链表的实际情况
如果链表中存在环 ,则返回 true 否则,返回 false

示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点

示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点

示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
思路1:
不断遍历链表,遍历过的链表设置值为ok,如果遍历到值为ok的链表,则表示链表中有环

思路2(不推荐):
能够遍历完成的表则不是环形链表,给一个极大的数进行循环,如果能遍历完成,则不是链表,如果出现一个巨大的环形链表,会出现错误,只有在节点数目范围有做限制的情况下可以使用

代码:
class ListNode
{
public $val = 0;
/**
* @var ListNode|null
*/
public $next = null;

function __construct($val = 0, $next = null)
{
$this->val = $val;
$this->next = $next;
}
}

/**
* @param ListNode $head
*
* @return Boolean
*/
function hasCycle($head)
{
while ($head) {
// 如果节点值已经被标记过,则链表中存在环
if ($head->val === 'ok') {
return true;
}

$head->val = 'ok';

// 不断循环直至链表结束
$head = $head->next;
}

return false;
}