Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

141. 环形链表 #8

Open
webVueBlog opened this issue Apr 21, 2022 · 1 comment
Open

141. 环形链表 #8

webVueBlog opened this issue Apr 21, 2022 · 1 comment
Labels

Comments

@webVueBlog
Copy link
Owner

webVueBlog commented Apr 21, 2022

  1. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

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

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

示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

思路:暴力破解法:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }

 */

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    // 首先判断一下这个链表是不是空的链表或者是这个链表是不是只有一个节点
    // 如果是的话那就说明他不可能构成环形链表
    // 我们直接给他返回false
    if(!head || head.next === null) return false
    // 否则的话呢,我们就从头指针开始然后遍历一下 遍历一下这个链表
    let p = head
    const arr = []
    while(p !== null) {
        // 我们判断一下这个数组里面是否已经 包含了这个节点
        if(!arr.includes(p)) {
            // 如果不包含的话呢我们就 把这个节点直接push到这个数组里面
            arr.push(p)
            // 然后把 p 指针指向下一个节点
            p = p.next
        } else {
            // 否则如果这个节点已经在数组里面出现了
            // 就说明他是第二次走到了这里
            // 那么我们返回true
            // 说明他有 他是一个环形链表
            return true;
        }
    }
    // 否则的话呢
    // 就是说明他走到了末尾的空节点 
    // 那么我们就返回了false
    return false
};
@webVueBlog
Copy link
Owner Author

快慢指针法:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 141. 环形链表
 */

/**
 * @param {ListNode} head
 * @return {boolean}
 */
 // 快慢指针法
 // 快慢指针法是我们 同时定义两个指针 
 // 一个指针每次走两步 一个指针每次走一步
 // 那么如果他不是一个环形链表的话
 // 快指针会优先走到末尾的空节点
 // 如果他是环形链表的话那么
 // 总有一次循环之后
 // 快指针会去找 会去跟慢指针重逢
var hasCycle = function(head) {
    // 首先判断它是不是一个空链表
    if(!head || head.next === null) return false
    // 有可能是环形链表的话,我们就定义两个指针
    // q 是快指针 它就会先走到末尾
    let p = q = head
    do {
        // p 每次走一步
        p = p.next
        // q 每次走两步
        q = q.next.next
    } while (p !== q && q !== null && q.next !== null)
    // 然后,到这里之后我们判断 p是不是找到了q
    // 就可以判断它 是不是一个环形链表
    return p === q
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant