你无敌了!算法刷题之路之链表初探(一)

news2024/11/23 4:18:16

算法刷题之路之链表初探(一)

今天来学习的算法题是leecode141环形链表,是一道简单的入门题,话不多说!直接上!

条件

在这里插入图片描述

项目解释

有题目可以知道,我们需要判断链表中是否存在环,其实也是说链表的next指针指向了之前只想过的node,所以我们可以从过程出发,使用循环来遍历链表中的每一条数据,来完成题目

根据题目的要求我们可以选用Set集合(可以自动去重),在遍历的过程中,将每一个node加入数组中,随后将指针指向下一个node,当向set中添加数据的操作报错时,证明出现了环。

代码

  public boolean hasCycle(ListNode head) {
           //判断环形链表(使用HashSet完成)
            //set是无序的!!!
            HashSet<ListNode> listNodes = new HashSet<>();
            while (head != null){
                //因为Set是去重的,当Set中元素与循环得到的链表元素相等时,返回ture说中此时有环行链表出现
                if(!listNodes.add(head)){
                    return true;
                }

                head = head.next;
            }
             return  false;

优化方向

众所周知,在Java中要遍历每一个链表是非常消耗资源的,与此同时判断环的经典解决方法就是快慢指针,那我们是不是可以使用快慢指针呢??

废话,这么简单的题,当然可以啦!!!

代码
  public static class Solution {
        public boolean hasCycle(ListNode head) {
           //判断环形链表(使用HashSet完成)
            //set是无序的!!!
            HashSet<ListNode> listNodes = new HashSet<>();
            while (head != null){
                //因为Set是去重的,当Set中元素与循环得到的链表元素相等时,返回ture说中此时有环行链表出现
                if(!listNodes.add(head)){
                    return true;
                }

                head = head.next;
            }
             return  false;
            /**
             * 使用快慢指针,判断更加快速
             *
             *      if(head==null||head.next==null){
             *         return false;
             *      }
             *
             *       ListNode fast = head.next;
             *       ListNode slow = head;
             *
             *       while (fast != slow){
             *         if(fast ==null||fast.next==null){
             *             return false;
             *         }
             *          slow = slow.next;
             *          fast = fast.next.next;
             *       }
             *       return true;
             */
        }
    }

测试

import java.util.HashSet;

public class Leecode141 {

    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public static class Solution {
        public boolean hasCycle(ListNode head) {
           //判断环形链表(使用HashSet完成)
            //set是无序的!!!
            HashSet<ListNode> listNodes = new HashSet<>();
            while (head != null){
                //因为Set是去重的,当Set中元素与循环得到的链表元素相等时,返回ture说中此时有环行链表出现
                if(!listNodes.add(head)){
                    return true;
                }

                head = head.next;
            }
             return  false;
            /**
             * 使用快慢指针,判断更加快速
             *
             *      if(head==null||head.next==null){
             *         return false;
             *      }
             *
             *       ListNode fast = head.next;
             *       ListNode slow = head;
             *
             *       while (fast != slow){
             *         if(fast ==null||fast.next==null){
             *             return false;
             *         }
             *          slow = slow.next;
             *          fast = fast.next.next;
             *       }
             *       return true;
             */
        }
    }

    public static void main(String[] args) {
        // Example 1: No cycle
        ListNode head1 = new ListNode(1);
        head1.next = new ListNode(2);
        head1.next.next = new ListNode(3);
        head1.next.next.next = new ListNode(4);
        head1.next.next.next.next = null; // No cycle
        System.out.println("Has cycle in Example 1: " + new Solution().hasCycle(head1));

        // Example 2: Cycle exists
        ListNode head2 = new ListNode(1);
        head2.next = new ListNode(2);
        head2.next.next = new ListNode(3);
        head2.next.next.next = new ListNode(4);
        head2.next.next.next.next = head2.next; // Cycle: 4 -> 2
        System.out.println("Has cycle in Example 2: " + new Solution().hasCycle(head2));
    }
}
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费翻译API及使用指南——百度、腾讯

目录 一、百度翻译API 二、腾讯翻译API 一、百度翻译API 百度翻译API接口免费翻译额度&#xff1a;标准版&#xff08;5万字符免费/每月&#xff09;、高级版&#xff08;100万字符免费/每月-需个人认证&#xff0c;基本都能通过&#xff09;、尊享版&#xff08;200万字符免…

申请免费6个月SSL证书方式和证书特点槽点

当前&#xff0c;HTTPS访问已成为网站标配。随着免费证书平台的不断涌现&#xff0c;Lets Encrypt尤为瞩目&#xff0c;其提供的泛域名和多域名证书申请功能&#xff0c;显著降低了站长和企业的经济负担。从一开始&#xff0c;来此加密就支持通过Lets Encrypt申请免费的域名SSL…

C语言分支和循环(下)

C语言分支和循环&#xff08;下&#xff09; 1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现 掌握了前面学习的这些知识&#xff0c;我们就可以写⼀些稍微有趣的代码了&#xff0c;比如&#xff1a; 写⼀个猜数字游戏 游戏要求&#xff1a; 电…

Python逻辑控制语句 之 判断语句--if elif else 结构(多重判断)

1.if elif else 的介绍 # if elif else 如果 ... 如果 ... 否则 .... # 多个如果之间存在关系 应用场景&#xff1a;在判断条件时, 需要判断 多个条件, 并且对应不同条件要执行 不同的代码 2.if elif else 的语法 if 判断条件1: 判断条件1成立&#xff0c;执行的代码 elif 判…

家电品牌如何利用3D数字化技术,突破转型瓶颈?

家电行业正经历着从增量市场向存量市场的转变&#xff0c;用户的消费观念也日趋成熟&#xff0c;更加注重产品的体验和服务质量。无论是线上购物平台还是线下实体门店&#xff0c;提供个性化和增强体验感的产品与服务已成为家电市场未来发展的核心驱动力。 51建模网依托“3D数字…

嵌入式Linux系统编程 — 5.1 uname、sysinfo、gethostname、sysconf函数查询系统信息

目录 1 uname函数获取内核名称和信息 1.1 Linux系统命令行 1.2 系统调用函数 2 sysinfo 函数 3 gethostname 函数 4 sysconf函数 1 uname函数获取内核名称和信息 1.1 Linux系统命令行 在Linux系统中&#xff0c;uname命令行工具可以显示关于当前操作系统的信息。这个命…

C++进阶

C进阶 一、细节1.cout与输出缓冲区2.constexpr3.NULL和nullptr是不同的类型4.关于inline5.函数杂合用法6.const char*、char const*、char * const7.进程地址空间&#xff0c;所谓静态区常量区不准8.位运算9.多态9.1 内存切片9.2 转型9.3 构造函数和析构函数里是静态绑定9.4 dy…

石家庄高校大学智能制造实验室数字孪生可视化系统平台项目验收

智能制造作为未来制造业的发展方向&#xff0c;已成为各国竞相发展的重点领域。石家庄高校大学智能制造实验室积极响应国家发展战略&#xff0c;结合自身优势&#xff0c;决定引进数字孪生技术&#xff0c;构建一个集教学、科研、生产于一体的可视化系统平台。 数字孪生可视化…

隐藏Python运行产生的缓存文件(__pycache__)

不少同学使用VScode 提交或运行python代码的时候&#xff0c;出现一些缓存文件 类似于(__pycache__) 这种&#xff0c;对于我这种有一丢丢强迫症的人来说&#xff0c;运行一次就得删除一次&#xff0c;那有没有什么办法将其隐藏的&#xff1f; 在vscode编辑器中打开设置&#…

用易查分制作《假期安全承诺书》支持在线手写签名,一键导出打印

暑假将至&#xff0c;学校通常会下发假期安全承诺书让家长签署。 易查分可以实现网上下发安全承诺书通知&#xff0c;让学生家长进行签名确认&#xff0c;还可以导出PDF文件&#xff0c;方便打印一人一张的纸质版承诺书&#xff0c;下面就来教给大家如何使用吧&#xff01; 暑假…

搭建大型分布式服务(四十一)SpringBoot 整合多个kafka数据源-支持亿级消息生产者

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

electron线上更新

一、安装electron-updater npm install --save electron-updater二、在main.js中引入使用 import { autoUpdater } from electron; if (!isDev) {const serverUrl https://your-update-server.com; // 自定义更新服务器地址或GitHub Releases地址autoUpdater.setFeedURL(${…

新奥集团校招面试经验分享、测评笔试题型分析

一、走进新奥集团 新奥集团成立于1989年&#xff0c;总部位于河北廊坊&#xff0c;是中国领先的清洁能源企业集团。业务涵盖城市燃气、能源化工、环保科技等多个领域&#xff0c;致力于构建现代能源体系&#xff0c;提升生活品质。 二、新奥集团校招面试经验分享 新奥集团的…

力扣第一道困难题《3. 无重复字符的最长子串》,c++

目录 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 方法四&#xff1a; 没有讲解&#xff0c;但给出了优秀题解 本题链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 话不多说&#xff0c;我们直接开始进行本题的思路解…

Facebook的投流技巧有哪些?

相信大家都知道Facebook拥有着巨大的用户群体和高转化率&#xff0c;在国外社交推广中的影响不言而喻。但随着Facebook广告的竞争越来越激烈&#xff0c;在Facebook广告上获得高投资回报率也变得越来越困难。IPIDEA代理IP今天就教大家如何在Facebook上投放广告的技巧&#xff0…

使用stat()函数的例子

代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h>int main(void) {struct stat st;if(-1stat("test.txt",&st)){printf("获得文件状态失败\n");return -1;}printf(&q…

14 卡尔曼滤波及代码实现

文章目录 14 卡尔曼滤波及代码实现14.0 基本概念14.1 公式推导14.2 代码实现 14 卡尔曼滤波及代码实现 14.0 基本概念 卡尔曼滤波是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法。由于观测数据包括系统中的噪声和…

系统总结:AI产品经理知识体系

算法demo更偏向于命题作文&#xff0c;而在产品商业化的时候&#xff0c;关键的第一步就在于基于场景&#xff0c;去重新定义问题&#xff01; 近两年人工智能行业在国内外得到了爆发试的增长&#xff0c;各大巨头纷纷布局成立了自己的人工智能实验室和研究院&#xff0c;但是我…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中&#xff0c;如果你看到“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的”这样的提示&#xff0c;通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤&#xff1a; 解决办法&#xff1a;…

携程二面测开—中核

4.12 35min面试经验 自我介绍 在面试的开始&#xff0c;我简洁明了地进行了自我介绍&#xff0c;突出了我的教育背景、技能特长以及实习经历&#xff0c;为后续的面试内容打下了良好的基础。 实习的具体工作内容 在谈及实习经历时&#xff0c;我详细阐述了在实习期间所承担…