首页 > 其他分享 >快慢指针-leetcode141-判断链表中是否有环。

快慢指针-leetcode141-判断链表中是否有环。

时间:2023-03-27 10:14:20浏览次数:41  
标签:leetcode141 head ListNode next 链表 有环 节点 指针

LeetCode #141 题目描述:

给定一个链表,判断链表中是否有环。

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

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

示例 1:
example1

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

示例 2:
example2

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

示例 3:
example3

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

提示:

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

LeetCode #141 解题思路:

这道题可以使用两种方法来解决:

方法一:【哈希表】
我们遍历链表中的每一个节点,将当前节点添加到哈希表中,然后考虑下一个节点,如果下一个节点存在于哈希表中,说明存在环;否则如果抵达了空节点 null 还没有找到环的话,则说明不存在环。

方法二:【快慢指针】
这种方法也被称为 Floyd 判圈算法。首先我们定义两个指针:快指针和慢指针。将快指针和慢指针都指向链表开头,然后让它们同时往链表尾部移动。此时,如果链表中不存在环,那么快指针迟早会到达链表末尾,此时可以返回 false。但是如果链表中存在环,则快指针就会在环内绕圈,而慢指针不会进入重复区域,因此最终一定会追上快指针。此时可以返回 true。

本题使用的是方法二,快慢指针


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null){
            return false;
        }

        ListNode fastP = head;
        ListNode slowP = head;

        //如果有环一定相遇在环内
        while(fastP!=null && fastP.next!=null){

            fastP = fastP.next.next;
            slowP = slowP.next;
            if(fastP == slowP){
                return true;
            }
        }
        return false;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

标签:leetcode141,head,ListNode,next,链表,有环,节点,指针
From: https://www.cnblogs.com/xiaoshahai/p/17260550.html

相关文章

  • Linux链表
    linux创建及初始化链表动态方法通过structlist_head创建,INIT_LIST_HEAD初始化。(list_head以及INIT_LIST_HEAD位于<linux/list.h>)structlist_head{structlist......
  • 203. 移除链表元素
    c++解法解法1:先确定头节点,而后移动指针/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode()......
  • LeetCode 142.环形链表II
    力扣LeetCode142.环形链表II题目跳转链接解题思路:代码随想录:142.环形链表II从头结点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点,那么当这......
  • 数据结构-->单链表OJ题--->讲解_03
    老铁们,现在开讲啦!!下面是本期的OJ试题:>1.给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。现列图式样所示:>上图只有一......
  • 24. 两两交换链表中的节点——学习笔记
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输......
  • 206.反转链表——学习笔记
    题目:给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:hea......
  • 707.设计链表——学习笔记
    题目:你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果......
  • 142.环形链表II——学习笔记
    题目:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。......
  • 面试题 02.07. 链表相交——学习笔记
    题目:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据保......
  • 19.删除链表的倒数第N个节点——学习笔记
    题目:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:......