算法是求职的敲门砖,大厂面试一面几乎都会问算法题,以此来考察候选人的思维逻辑及编码能力。
今天要AC的题目叫做「环形链表」,在 leetcode 上的原题链接为:https://leetcode-cn.com/problems/linked-list-cycle/

1. 题目
给你一个链表的头节点 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 解释:链表中没有环。
提示:
- 链表中节点的数目范围是 [0, 104]
- -105 <= Node.val <= 105
- pos 为 -1 或者链表中的一个有效索引
2. 解题思路
这道题目就是让我们判断一个链表是否是环形的。环形链表的意思就是从某个节点开始,经过 N 次 next 操作,仍旧可以回到该节点。
首先来说一个最简单的解法:声明一个 Set 用于存储链表中的节点,对链表进行循环,每次循环判断当前节点是否已存在于 Set 中,若已存在毫无疑问该链表是一个环形链表;若不存在则将当前节点加入 Set 中,进行下一次循环。这里需要注意的问题是我们如何结束循环?
如果一个链表不是一个环形的,那么也就是说他是有终点的,终点的 next 当然就是 null 了,否则终点将不再是终点。
然后是第二种解法:快慢指针法。
快慢指针的思路就是,声明两个指针,一个每次走1步,另外一个名次走2步,如果这是一个环形链表,那么总有一天,慢指针会被快指针套圈,也就是慢指针等于快指针。同样的,如果链表不是环形的,那么快慢指针在前进的时候将会失败,也就是说快指针的 next 节点是 null 或者 快指针的 next 节点的 next 节点是 null(因为快指针走得快,所以我们只需要对快指针进行判断后继节点是否为空即可)。
用 Java 实现上述快慢指针的思路就是:

上述示例代码在 leetcode 上的执行结果是:

最后,本文收录于个人语雀知识库: 我所理解的后端技术,欢迎来访。
