首页 > 其他分享 >141. 环形链表

141. 环形链表

时间:2023-12-11 12:12:54浏览次数:30  
标签:head 141 nullptr 环形 next 链表 乌龟 指针

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, 10^{4}]\)
  • \(-10^{5} <= Node.val <= 10^{5}\)
  • \(pos\) 为 \(-1\) 或者链表中的一个 有效索引

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

2.题解

2.1 哈希表

思路

存储所有经过的节点指针到哈希表,并检测哈希表中是否存在当前指针,如存在则说明出现环路,否则若链表正常遍历结束至nullptr则是不存在环路

代码

class Solution {
public:
    bool hasCycle(ListNode *head) {
        unordered_set<ListNode *> hashSet;
        ListNode *p = head;
        while (p != nullptr){
           if(hashSet.count(p)) return true;
           hashSet.insert(p);
           p = p -> next;
        }
        return false;
    }
};

2.2 快慢指针

思路

本方法需要读者对「Floyd 判圈算法」(又称龟兔赛跑算法)有所了解。
假想「乌龟」和「兔子」在链表上移动,「兔子」跑得快,「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;如果该链表中有环,那么「兔子」会先于「乌龟」进入环,并且一直在环内移动。等到「乌龟」进入环时,由于「兔子」的速度快,它一定会在某个时刻与乌龟相遇,即套了「乌龟」若干圈。
我们可以根据上述思路来解决本题。具体地,我们定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。

代码

class Solution {
public:
    bool hasCycle(ListNode *head) {
       if (head == nullptr || head->next == nullptr)  return false;
       ListNode* fp = head->next;
       ListNode* sp = head;
       while (fp != sp){
          if (fp == nullptr || fp->next == nullptr){
              return false;
          }
          sp = sp->next;
          fp = fp->next->next;
       }
       return true;
    }
};

标签:head,141,nullptr,环形,next,链表,乌龟,指针
From: https://www.cnblogs.com/trmbh12/p/17894095.html

相关文章

  • 2023-2024-1 20231418 《计算机基础与程序设计》第11周学习总结
    2023-2024-120231418《计算机基础与程序设计》第11周学习总结这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业这个作业的目标1.学习《计算机科学概论》第15,16章并完成云班课测试;2.学习《C......
  • 234. 回文链表
    题目介绍给你一个单链表的头节点\(head\),请你判断该链表是否为回文链表。如果是,返回\(true\);否则,返回\(false\)。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围\([1,10^{5}]\)内\(0<=Node.val<=9\)进......
  • 2023-2024-1 20231412 《计算机基础与程序设计》第十一周学习总结
    2023-2024-120231412《计算机基础与程序设计》第周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13007这个作业的目标《计......
  • 2023-2024-1 20231416《计算机基础与程序设计》第十一周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业)这个作业的目标自学《计算机科学概论》第15,16章,《C语言程序设计》第10章作业正文https://www.cnblogs.com/shansh......
  • 2023-2024-1 20231417 《计算机基础与程序设计》第十一周学习总结
    2023-2024-120231417《计算机基础与程序设计》第十一周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业)这个作业的目标自学《计算机科学概论》第15,16章,《C......
  • 代码 测试用例 测试结果 测试结果 24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数目在范围 [0,100] 内......
  • 160.相交链表
    1.题目介绍给你两个单链表的头节点 \(headA\)和\(headB\),请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回\(null\)。图示两个链表在节点\(c1\)开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构......
  • 2023-2024-1 20231419 《计算机基础与程序设计》第十一周学习总结
    2023-2024-120231419《计算机基础与程序设计》第十一周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK11这个作业的目标自学《计算机科学......
  • 2023-2024-1 20231410刘珈岐《计算机基础与程序设计》第11周学习总结
    2023-2024-120231410刘珈岐《计算机基础与程序设计》第11周学习总结作业信息这个作业属于哪个课程(https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里(https://www.cnblogs.com/rocedu/p/9577842.html#WEEK11)这个作业的目标自学教材《......
  • 【JavaSE】数据结构(栈、队列、数组、链表)
    什么是数据结构?数据结构是计算机底层存储、组织数据的方式,是指数据相互之间是什么方式排列在一起的常见的数据结构栈、队列、数组、链表二叉树、二叉查找树、平衡二叉树、红黑树哈希表栈特点:先进后出队列特点:先进先出数组特点:有索引,内存连续优点:查询速度快O(1)缺点:增......