LeetCode算法题-Linked List Cycle(Java实现)

用顺序表、单链表将负数移动到其他元素前面 1、 有一个整数顺序表L,设计一个尽可能高效的算法将所有负整数的元素移到其他元素的前面,并给出算法的时间和空间复杂度。例如,L=(1,2,-1,-2,3,-3,4),移动后L=(-1,-2,-3,2,3,1,4)。例如,L=(1,2,-1,-2,3,-3,4),移动后L=(-1,-2,-3,1,2,3,4)。 阅读详情

这是悦乐书的第176次更新,第178篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第35题(顺位题号是141)。给定一个链表,确定它是否有一个循环。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 理解题意

什么样结构的链表才算是拥有一个循环呢?

链表中某一节点的引用指向了当前链表中已经存在的另一节点时,此链表存在循环。

ListNode L = new ListNode(1);
ListNode L2 = new ListNode(2);
ListNode L3 = new ListNode(3);
ListNode L4 = new ListNode(4);
ListNode L5 = new ListNode(5);
ListNode L6 = new ListNode(6);
L.next = L2;
L2.next = L3;
L3.next = L4;
L4.next = L5;
L5.next = L3;

上面的链表就存在循环,L5的引用指向了L3。如果仅仅是节点值相等,是不存在循环的,因为他们的引用始终不同。

03 第一种解法

可以打个比方,如果两个人甲和乙同时在一条跑道上跑步,甲以2.5m/s的速度向前跑,乙以5m/s的速度向前跑,如果跑道是环形的,甲和乙肯定会在某一个地方至少相遇一次;如果跑道是直线形或非环形的,甲和乙是不会相遇的。

使用双指针,一个是正常向前,一次移动一个节点,第二个是间隔一个节点向前移动,如果第二个指针碰到了可以循环的节点,会在循环的过程中遇到第一个指针,此时就满足了形成循环的条件。

特殊情况:链表为空时,直接返回false。

public boolean hasCycle(ListNode head) {
    if (head == null) { 
        return false;
    }
    ListNode slow = head;
    ListNode fast = head;
    while (slow != null && fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
        if (slow == fast) {
            return true;
        }
    }
    return false;
}

04 第二种解法

还是以上面跑步为例,不过稍微有点变化。甲还是以2.5m/s的速度跑步,此时乙在跑道中给了甲一根棒子,并站在原地等甲把棒子还给自己,如果跑道是环形的,乙肯定是会等到甲把棒子还给自己,如果跑道是直线或者非环形的,甲就带着棒子自己跑了。

我们可以使用一个标记,赋值给每一个节点,然后使用递归,直到碰到给出去的标志为止。

public boolean hasCycle2(ListNode head) {
    if(head == null) {
        return false;
    }
    if (head.val == Integer.MIN_VALUE-1) {
        return true;
    }
    head.val = Integer.MIN_VALUE-1;
    return hasCycle2(head.next);
}

如果某一个节点正好本身就拥有所要赋值的标志呢?会有一定影响,如果限制节点值的取值范围,此解法是完全可行的。

05 第三种解法

使用哈希表,将每一个节点的引用都存起来,如果哈希表中存在了某一个节点的引用,说明此链表是循环的。

public boolean hasCycle3(ListNode head) {
    Set<ListNode> nodesSeen = new HashSet<>();
    while (head != null) {
        if (nodesSeen.contains(head)) {
            return true;
        } else {
            nodesSeen.add(head);
        }
        head = head.next;
    }
    return false;
}

此解法的空间复杂度是O(n)。

06 小结

笔试或者面试遇到此题时,推荐第一种解法,如果有限制链表节点值的取值范围,第二种解法也是完全可行的。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

已知线性表按顺序存于内存,每个元素都是整数,试设计把所有值为负数的元素移到全部正数值元素前边的算法 .cpp 已知线性表按顺序存于内存,每个元素都是整数,把所有值为负数的元素移到全部正数值元素前边的算法 立即下载

相关推荐

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 239

将所有负数移动到开头所有正数移到结尾

题目 给定一个整数数组 nums,数组中有正数也有负数,将负数移动到开头,正数移动到结尾 要求:一次遍历。 示例: 给定 nums = [-2, -7,5,9,-10, 11, -15] 返回 [-2, -7, -10, -15, 5, 11, 9] 解题思路 设置一个进位值j,来保存一个正数的值,跟随i进行遍历移动,当出现nums[i]小于0时,0也就是分水岭,进行nums[i]与nums[j]置换。 这里使用了 快速置换的方法 [a,b]=[b,a]; ES6的新方法 省去了设置temp的中间值

破茧 1990

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3351

数据结构3

文章目录奇数移到偶数前面最长连续递增子序列jmu-ds-简单密码 奇数移到偶数前面 1.有一个顺序表L,假设元素类型为int,设计一个尽可能高效的算法,将所有奇数移到偶数的前面 解法一: #include <iostream> #include<malloc.h> using namespace std; #define MAXSIZE 100 typedef struct list{ int data[MAXSIZE]; int length; }SqList; void C.

的博客 734

西门子S7通信协议TSAP配置全攻略:从默认值到自定义修改(附各型号对照表)

本文深入解析西门子S7通信协议中TSAP配置的核心原理与实战方法。针对S7-200/300/400/1200/1500等主流PLC型号,提供了默认TSAP对照表,并详细阐述了如何根据机架号和插槽号计算或自定义Remote TSAP。文章结合常见连接失败案例,给出了系统化的排错流程,旨在帮助工程师快速打通S7通信链路,提升工业自动化现场调试效率。

weixin_29163797的博客 285

手把手教你:基于STM32H7自制飞控,如何从零开始移植PX4固件(附避坑指南)

本文详细介绍了如何基于STM32H7自制飞控板并移植PX4固件的完整流程,包括硬件设计、开发环境搭建、关键配置文件移植、驱动开发与适配等关键步骤。特别针对PX4-AutoPilot的移植过程提供了实用技巧和避坑指南,帮助开发者高效完成飞控系统开发。

weixin_30271335的博客 144

NYUer | LeetCode142 Linked List Cycle II

NYUer | LeetCode142 Linked List Cycle II

Moses_SU的博客 245

【复现论文】Looking here or there? Gaze Following in 360-Degree Images

论文:Looking here or there?

RichardoMu的博客 1131

LeetCode 142 — Linked List Cycle II(C++ Java Python)

题目:http://oj.leetcode.com/problems/linked-list-cycle-ii/ Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using ex

龙之梦 3072

RT-DETR算法优化改进:Backbone改进 | HGBlock完美结合PPHGNetV2 GhostConv

GhostConv助力RT-DETR ,HGBlock与PPHGNetV2 GhostConv完美结合

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2913

群无人机航迹规划-虚拟管道

图源北理工全权老师团队虚拟管道相关论文,文字为个人理解,以ppt形式分享报告。

coldmood77的博客 669

【Leetcode】Linked List Cycle

原题链接:https://leetcode.com/problems/linked-list-cycle/ 题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 思路: 两个指针,一个移动

业精于勤,荒于嬉 2431

万字详解YOLOv8网络结构Backbone/neck/head以及Conv、Bottleneck、C2f、SPPF、Detect等模块

YOLOv8是由Ultralytics开发的最先进的目标检测模型,推升了速度、准确性和用户友好性的界限。YOLO这一缩写代表“你只看一次”(You Only Look Once),通过在一次网络传递中同时预测所有边界框,提升了算法的效率和实时处理能力。相比之下,其他一些目标检测技术需要经过多个阶段或过程来完成检测。YOLOv8在流行的YOLOv5架构上进行了扩展,在多个方面提供了改进。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 14万+

【LeetCode-Java实现】141. Linked List Cycle

141. Linked List Cycle题目描述解题思路实现代码 题目描述 Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked list, we use an integer pos which represents the position (0-in...

IT Crowd的博客 317

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

LeetCode-142. Linked List Cycle II [C++][Java]

Given theheadof a linked list, returnthe node where the cycle begins. If there is no cycle, returnnull.

贫道绝缘子的博客 267

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode 141 — Linked List Cycle(C++ Java Python)

题目:http://oj.leetcode.com/problems/linked-list-cycle/ Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 题目翻译: 给定一个链表,确定它是否有环。 进阶: 你可

龙之梦 3543

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

leetcode linked-list-cycle(Java)

leetcode题目 linked-list-cycle 题目描述 * Given a linked list, determine if it has a cycle in it. * Follow up: * Can you solve it without using extra space? 思路 * 1、快慢指针同时遍历链表,相遇即存在环,否则不存在 代码 packag...

聚沙成塔 321

leetcode:142. Linked List Cycle II(Java)解答

转载请注明出处:z_zhaojun的博客 原文地址:http://blog.youkuaiyun.com/u012975705 题目地址:https://leetcode.com/problems/linked-list-cycle-ii/ Linked List Cycle II Given a linked list, return the node where the cycle be

z_zhaojun的博客 2990

[leetcode note] Linked List Cycle

时间: 2019-12-12 题目地址: https://leetcode.com/problems/linked-list-cycle/ Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked list, we use an integer pos whic...

草堂笺 264

leetcode Linked List Cycle题解

中文描述: Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where ...

leo_weile的博客 187

【Leetcode】141. Linked List Cycle

题目地址: https://leetcode.com/problems/linked-list-cycle/ 链表求环,返回环是否存在。经典的快慢指针算法。如果链表没有node,或者链表只有一个node且其未指向自己,则返回false。否则设快慢指针slow和fast初始化为head,slow每次走一步,fast每次走两步,如果某一时刻fast = null或者fast.next = null,说...

数学、算法爱好者的博客 201

Leetcode [141, 142] Linked List Cycle,java解法

141 Linked List Cycle Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked list, we use an integerposwhich represents the position (0-indexed)in the l...

YuanTheCoder的博客 419

LeetCode-141. Linked List Cycle [C++][Java]

Givenhead, the head of a linked list, determine if the linked list has a cycle in it.

贫道绝缘子的博客 312

LeetCode 141 Linked List Cycle 142 Linked List Cycle II

问题描述: 解答: public class Solution { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode slow=head;...

susuxuezhang的博客 272

LeetCode Linked List Cycle

原题链接在这里:https://leetcode.com/problems/linked-list-cycle/ 两个指针,一快runner,每次走两步;一慢walker,每次走一步,若是它俩相遇就是有cycle。 Note: 这里的while loop 终止条件是runner!=null && runner.next!=null, 因为下面会用到 runner.next.next.  这类

Dylan_Java_NYC的博客 334
上一篇: LeetCode算法题-Single Number(Java实现)
下一篇: LeetCode算法题-Min Stack(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值