持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
有人相爱,有人夜里开车看海,我是LeetCode第一题都做不出来
此题为百度,阿里巴巴,小米集团,涂鸦智能的面试题
判断链表中是否有环
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。
例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:
示例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
}