题目
给你一个链表的头节点 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 }