环形链表
一、题目
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
解法一(快慢指针)
- 一个有环的链表,比作一个环形跑道,跑的快的运动员迟早会再次和跑得慢的运动员相遇
- 慢指针一次移动 1 位,快指针一次移动 2 位,快指针如果跑道了终点,证明无环,否则一定会相遇
- 快指针比漫指针多走1位,不管成环的地方在哪里,两者一定会相遇
代码:
var hasCycle = function(head) {
if (!head || !head.next) return false;
var slow = head; //头节点
var fast = head.next; // 头节点后的第一个节点
while (slow != fast) {
if (fast == null || fast.next == null) {
return false; // fast走的快,有终点也是先一步到达终点
}
slow = slow.next; // 走一步
fast = fast.next.next; // 走两步
}
return true;
};
结果
题解二 (set方法)
思路
- 遍历链表,放入 set 结构中,如果已经存在,则证明有环
代码
var hasCycle = function(head) {
var setBox = new Set();
while (head != null) {
if (setBox.has(head.next)) {
return true;
} else {
setBox.add(head.next);
head = head.next;
}
}
return false;
};
结果
三、写在最后
本文是链表-双指针思路的第一题,通过指针速度差异,来达到验证目的。
如果对你有所帮助不妨给本项目的github 点个 star,这是对我最大的鼓励~
关于我
- 花名:余光
- WX:j565017805
- 沉迷 JS,水平有限,虚心学习中
其他沉淀