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

141. 环形链表

时间:2024-06-02 10:44:36浏览次数:25  
标签:head 141 环形 fast next 链表 节点 指针

141. 环形链表   简单   相关标签 相关企业  

给你一个链表的头节点 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 或者链表中的一个 有效索引 。

 

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

 

思路

快慢指针,俩指针从头节点出发,一个快指针每次走两步,一个慢指针每次走一步,如果链表存在环路,那么快指针会追上慢指针

 

/**
 * 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 || head.next == null || head.next.next == null) return false;
        ListNode slow = head, fast = head;
        while(fast != null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast) return true;
        }
        return false;
    }
}

证明快慢指针算法(也被称为弗洛伊德的龟兔赛跑算法)的正确性,可以通过数学归纳法来完成。下面是证明的逻辑:

  1. 定义:假设链表由非环部分和环部分组成。设非环部分的长度为

    标签:head,141,环形,fast,next,链表,节点,指针
    From: https://www.cnblogs.com/ak918xp/p/18226863

相关文章

  • 合并两个有序递增链表
    题目如下: 代码如下:1#include<stdio.h>2#include<stdlib.h>34typedefstructListNode{5intval;6structListNode*next;7}ListNode_t;89structListNode*Merge(structListNode*pHead1,structListNode*pHead2)10{......
  • 单链表实现通讯录
    之前我们完成了基于顺序表(动态)实现通讯录,现在我们链表学完了,可以尝试着使用链表来实现我们的通讯录。首先我们要明白我们写的通讯录是由一个个节点组成的,每个节点里存储的就是我们的联系人信息。也就是说我们需要先写一个单链表,完成单链表的插入,删除等功能。然后在单链表......
  • 删除链表倒数第n个节点
    leetcode:19题。思路:定义快慢指针,让快指针先走n步,如何同时移动快慢指针,当快指针走到尾时,慢指针刚好是倒数第n个元素(的前一个)。例:删除倒数第二个节点。n=2;slowfast↓↓a->b->c->d->e->null/***Definitionforsingly-linkedlist.*publiccl......
  • 链表的练习
    目录一、链表的反转二、查找中间节点三、查找倒数第k个节点四、整合两个链表五、判断是否回文一、链表的反转对单链表进行反转,把头节点置为空,然后将头节点后面的节点依次插入到头节点的前面。publicListNodeReverseList(){if(head==null){//链表为空......
  • 一千题,No.0039(反转链表)
    给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为1→2→3→4→5→6,K 为3,则输出应该为3→2→1→6→5→4;如果 K 为4,则输出应该为4→3→2→1→5→6,即最后不到 K 个元素不反转。输入格式:每个输入包含1个测试用例。每个测试......
  • 链表9(优化版)7-9 sdut-C语言实验-约瑟夫问题
    7-9sdut-C语言实验-约瑟夫问题分数20全屏浏览切换布局作者 马新娟单位 山东理工大学n个人想玩残酷的死亡游戏,游戏规则如下:n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号......
  • 环形链表II
    前两天一直在debug,今天才有时间好好刷一下力扣,今天在代码随想录上看到环形链表,链接如下:https://leetcode.cn/problems/linked-list-cycle-ii/description/这道题官方有两种解法,一种是相对比较简单的哈希表,还有一种是利用数学计算出他们的规律进而解题。首先说第二种,在示例中......
  • 封装通用 ECharts 图表组件(三):环形图实现
    在数据可视化领域,ECharts是一个非常流行且功能强大的图表库。它提供了丰富的图表类型,能够满足各种复杂的数据展示需求。在本系列的第三篇文章中,我们将探讨如何封装一个通用的ECharts环形图组件。什么是环形图?环形图是一种特殊的饼图,它由一个内圆和一个外圆组成,中间的部分是......
  • leetCode.82. 删除排序链表中的重复元素 II
    leetCode.82.删除排序链表中的重复元素II题目思路:代码classSolution{public:ListNode*deleteDuplicates(ListNode*head){autodummy=newListNode(-1);dummy->next=head;autop=dummy;while(p->next){......
  • 探索数据结构:单链表的实践和应用
    ......