【路飞】环形链表

94 阅读1分钟

认识链表

链表:是一种不连续合集的数据结构。

应用场景:

链表 VS 数组

数组:

  • 优点:

    • 能快速定位到具体的某个值
  • 缺点:

    • 数组长度固定,不利于扩展

链表:

  • 优点:

    • 长度可任意增加
  • 缺点:

    • 不利于快速搜索

141. 环形链表

题目描述:

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。

解题思路:快慢指针法

使用两个指针,slow指针和fast指针。slow指针每次向后移动一步,fast指针每次向后移动两步。当两指针能够再次相遇时,则有环,否则无环。

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    if(!head) return false;

    let p = head, q = head.next;
    while(p != q && q && q.next){
        p = p.next;
        q = q.next.next;
    }
    return p == q;
};

解决思路:哈希法

  1. 使用一个空的数组temp,暴力遍历链表。
  2. 每移动一步就判断当前的节点是否包含在temp数组里,如果存在则说明有环,终止循环。否则第2步骤,直到循环到null结束,则无环
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    // 哈希法
    if(!head) return false;

    let arr = [];
    while(head != null) {
        if(arr.includes(head)) {
            return true;
        }
        arr.push(head);
        head = head.next;
    }
    return false;
};

自述

算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。