开启掘金成长之旅!这是我参与「掘金日新计划 · 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
}