场景描述
问题原文描述连接
给定一个链表,判断链表中是否有环。。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
进阶:
你能用 O(1)(即,常量)内存解决此问题吗?
C语言实现
初步思路
- 想要判断一个链表中是否中存在环,最初的一个很直观的想法便是用一指针遍历整个链表,并且在遍历过程中以某种方式标记已遍历结点,那么如果在遍历过程中出现标记,便说明链表中存在环。因此可以通过哈希表来解决此问题。但使用哈希表需要花费额外的存储空间,并不是最优的方式。
- 另一种思路是通过设立两个速度不同的指针对链表进行遍历,两指针同时出发,当链表中存在环时,最终快指针追上慢指针。如若不存在,快指针将停在链表尾,由此可判断是否有环。下面具体实现第二种思路。
具体过程
基本数据结构:结点结构体包括指针域next和数据域val。
设立两个指针fast,slow,一次分别移动1个位置和2个位置。起初两指针指向链表第一个结点。经过若干步后fast和slow两指针指向了同一结点,即fast == slow,那么可判断存在环。分析可知不存在环时,fast指针总是比slow先到达链表末尾(即fast->next ==null),若存在环,fast永远不会指向NULL。
注意:此处可能会存在一种想法:若将fast最后停留在链表尾作为判断条件,规定fast到达链表尾后,不允许再移动,假设若干次移动后fast->next 为NULL,下