算法---环形链表

“ 五一假期快要结束啦,让我们用一道简单的算法题来欢送五一假期末尾图片图片。今天算法很简单,让我们进行一个放松,涉及到的知识点是链表和双指针。”

PS:如果你对链表还不是很熟悉的话,那么我建议你先看看下面这篇我写的文章,对链表有了了解之后再来看看这道题。

数据结构与算法之单向链表

1. 题目描述

老规矩,上题目,先看看下面这张图的题目描述:
题目描述
环形链表题目描述

2. 解题思路

看了题目描述之后,你是不是心中已经有了思路了呢?当然如果你还没有思路的话,那么我再给你一个提示:双指针
接下来就是讲解思路的时刻:首先在讲解本题目之前,我需要让大家联想到赛道跑步的问题,比如A和B进行比赛,A的速度比B快,那么一定存在A会追上B他们会相遇的过程。而这道题就是A和B比赛的衍生,为什么呢?因为它是环形。关于这一类题目A追B会相遇的问题,就是一个快慢问题—快慢指针。对于快慢指针,如果有环的话那么一定会相遇,没有环的话不会相遇的。
有了上面的铺垫,我们再回到这道题中:利用快慢指针,我们定义一个fast和slow变量用于记录快慢两个指针变化,快指针它每次变化值next.next,而慢指针的话它的变化值就是next即可。然后不断的循环,至于循环结束条件在于fast以及它的next是否存在。

3. 代码实现

在看了代码思路之后是不是心中有了解题思路了,其实整体实现是十分简单的,关键在于如何巧妙的化解。接下来就是上代码的时刻啦:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/

/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let fast = head;
let slow = head;
while (fast && fast.next) {
fast = fast.next.next;
slow = slow.next;
if (fast === slow) return true;
}
return false;
};

有没有很简单的感觉,如果你还有问题的话欢迎在下方留言哟。如果你觉得该文章对你有帮助的话,不妨来一个三连哟。