创见博客
环形链表
七崽爱吃小饼干2026/01/06阅读 0专栏 算法合集

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

进阶:你能用 O(1)(即,常量)内存解决此问题吗?

解法:

ts
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function hasCycle(head: ListNode | null): boolean {
    // 可以用快慢指针或者哈希表来解决循环问题
    // 下面是哈希表的解法
    const map = new Map<ListNode, boolean>() // { [地址]: xx }
    let p = head
    map.set(p, true)
    if(p === null) return false
    while(p.next !== null){
        if(map.has(p.next)){
            return true
        }else{
            map.set(p.next, true)
            p = p.next
        }
    }
    return false
};
评论
0/100