前端算法-环形链表

111 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

题目

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。如果链表中存在环 ,则返回 true 。 否则,返回 false 。

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

思路

我们这里使用双指针进行实现,因为如果出现环的情况,那么双指针一定会相等。我们在函数中先判断当前的head形参或者head.next参数是否为null,如果是则返回false,我们这里声明三个变量i变量指向head形参的next参数,j变量和k变量都指向head形参,然后我们使用循环,当i变量不等null就一直循环,在循环中我们判断当前k变量的next和k变量的next的next参数其中是否有一个等于null如果是则返回false,否则就将k变量重新赋值,将k变量的值重新赋值为k.next.next参数,在进行判断当前的k变量是否等于i变量或者k变量是否等于j变量,如果满足条件则形成了闭环,直接返回true即可,如果不是则将i变量赋值为i变量的next参数,j变量赋值为j变量的next参数,进行下一轮循环,如果当i变量不为null之前还未返回false或者true,则直接返回false就行了

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function (head) {
    if (head === null || head.next === null) {
        return false
    }
    let i = head.next, j = head, k = head
    while (i !== null) {
        if (k.next === null || k.next.next === null) {
            return false
        }
        k = k.next.next
        if (k === i || k === j) {
            return true
        }
        i = i.next
        j = j.next
    }
    return false
}