判断链表中是否又环使用JavaScript解决算法问题

161 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

image.png

有人相爱,有人夜里开车看海,我是LeetCode第一题都做不出来

此题为百度,阿里巴巴,小米集团,涂鸦智能的面试题

判断链表中是否有环

判断给定的链表中是否有环。如果有环则返回true,否则返回false。

输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。

例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:

image.png

示例1

输入:{3,2,0,-4},1

返回值:true

说明:第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1(注:头结点为位置0),即-4->2存在一个链接,组成传入的head为一个带环的链表,返回true

解题思路

我们链表的每一个节点只有一个val值和一个next指针,也就是说一个节点只能有一个指针指向下一个节点,不能有两个指针,那这时我们就可以说一个性质:环形链表的环一定在末尾,末尾没有NULL了

因此环后面不可能还有一条尾巴。如果是普通线形链表末尾一定有NULL,那我们可以根据链表中是否有NULL判断是不是有环。但是如果是环形链表就会一直找不到NULL。所以我们可以把每一个值存入set中,如果出现重复的则就证明是环形链表

具体步骤如下

  • step1:初始化一个set数据结构

  • step2:如果当前节点不是null,则进入循环

  • step3: 判断当前节点是不是在set中,如果是则就证明是环形链表,返回true

  • step4: 将当前节点添加入set中

  • step5: 如果跳出循环则证明不是环形链表,返回false

function hasCycle( head ) {
    // write code here
    let set = new Set()
    while(head){
        if(set.has(head)){
            return true
        }
        set.add(head)
        head = head.next
    }
    return false
}