【链表part02】| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、02.07.链表相交、142.环形链表

news2024/11/19 15:13:59

目录

✿LeetCode24.两两交换链表中的节点❀

 ✿LeetCode19.删除链表的倒数第N个节点❀

✿LeetCode面试题 02.07. 链表相交❀

✿LeetCode142.环形链表||❀ 


✿LeetCode24.两两交换链表中的节点❀

链接:24.两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

我发现我已经找到写链表题的秘诀了,就是画图模拟,这样真的可以让你的思路很清晰,如果直接看代码的话,可能一下就绕进去了,但是画图你可以自己操作指针指向哪,直到完成题目的要求,以下是我写的代码: 

public ListNode swapPairs(ListNode head) {
        if(head==null || head.next==null){
            return head;
        }
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode cur=dummy;
        while(cur.next!=null && cur.next.next!=null){
            ListNode temp1=cur.next;
            ListNode temp2=cur.next.next.next;
            cur.next=cur.next.next;
            temp1.next.next=temp1;
            temp1.next=temp2;
            cur=temp1;
            
        }
        return dummy.next;
    }

此外还可以用递归,递归更像是直白的思路 

public ListNode swapPairs(ListNode head) {
        // 递归版本
        if(head==null || head.next==null){
            return head;
        }
        ListNode next=head.next;
        ListNode newNode=swapPairs(next.next);
        next.next=head;
        head.next=newNode;
        return next;
    }

 测试用例:

1.输入偶数节点个数的链表

2.输入奇数节点个数的链表

3.输入只有一个节点的链表

4.输入空链表

 ✿LeetCode19.删除链表的倒数第N个节点❀

链接:19.删除链表的倒数第N个节点

 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

对于链表题目,不得不考虑头结点,如果要删除的元素是头结点该怎么操作呢?答案就是设计一个虚拟头结点dummy,这样头结点就可以看成一个普通的节点进行操作了,这道题的思路就是让fast先走n+1步,然后fast和slow一起走,fast=null的时候,slow正好是要删除节点的前一个节点,具体代码如下:

public ListNode removeNthFromEnd(ListNode head, int n) {
        // 1 <= n <= sz
        // 1 <= sz <= 30  
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode fast=dummy;
        // fast先走n+1步
        for(int i=0;i<n+1;i++){
            fast=fast.next;
        }
        ListNode slow=dummy;
        while(fast!=null){
            fast=fast.next;
            slow=slow.next;
        }
        slow.next=slow.next.next;
        return dummy.next;

    }

测试用例:

1.删除链表中间的一个节点

2.删除链表末尾的一个节点

3.删除头结点

4.n<1或n>size(题目没有这类用例)

5.链表为空(题目没有这类用例)

✿LeetCode面试题 02.07. 链表相交❀

链接:02.07.链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

快慢指针可以解决链表中的很多问题,此题就是一个典型的例子,先计算出两个链表的长度差len,长的链表先走 len步,然后两个链表一起走,相等的时候即相交,代码如下:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null || headB==null){
            return null;
        }
        int lenA=0;
        int lenB=0;
        ListNode indexA=headA;
        ListNode indexB=headB;
        while(indexA!=null){
            lenA++;
            indexA=indexA.next;
        }
        while(indexB!=null){
            lenB++;
            indexB=indexB.next;
        }
        if(lenB>lenA){
            ListNode temp=headA;
            headA=headB;
            headB=temp;
        }
        indexA=headA;
        indexB=headB;
        int len=Math.abs(lenA-lenB);
        while(len>0){
            indexA=indexA.next;
            len--;
        }
        while(indexA!=null && indexB!=null){
            if(indexA==indexB){
                return indexA;
            }
            indexA=indexA.next;
            indexB=indexB.next;
        }
        return null;
    }

 测试用例:

  1. 输入两个相交的链表且两个链表的长度不同
  2. 输入两个不想交的链表
  3. 输入的两个链表其中有一个是空链表
  4. 输入的两个都是空链表
  5. 输入两个相等的链表(从头结点就相交)
  6. 输入的两个链表最后一个节点才相交

✿LeetCode142.环形链表||❀ 

链接:142.环形链表||

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表

 这道题首先要判断是否有环,定义一个快慢指针,快指针每次走两步,慢指针每次走一步,如果两个指针相遇的话就代表有环,如果快指针指向null了就代表无环(环形链表拥有不可能指向空),如果有环再计算入环的第一个节点的下标,计算过程如下:

快指针走了x+y+n(y+z),慢指针走了x+y,又有快指针走的步数是慢指针的两倍,所以

x+y+n(y+z)=2(x+y)  ->  x+y=n(y+z)

我们要求的是x: x=n(y+z)-y=(n-1)(y+z)-z

当n=1的时候 x=z

所以当快慢指针相遇时,一个指针从相遇点出发,一个指针从头结点出发,两指针相遇的节点即为入环的第一个节点,代码如下:

 

public ListNode detectCycle(ListNode head) {
        if(head==null || head.next==null){
            return null;
        }
        ListNode fast=head;
        ListNode slow=head;
        // 看是否有环
        while(fast!=null && fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            // 有环
            if(fast==slow){
               slow=head;
               while(fast!=null){
                   if(slow==fast){
                       return slow;
                   }
                   slow=slow.next;
                   fast=fast.next;
                   
               }
            }
        }
        return null;
    }

 测试用例:

  1. 输入一个有环的链表
  2. 输入一个无环的链表
  3. 输入一个只有一个节点的链表
  4. 输入一个空链表

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

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

相关文章

轻骑逐单于,大雪满弓刀:华为分布式存储的一骑绝尘

唐代诗人卢纶&#xff0c;有一首脍炙人口的《和张仆射塞下曲》&#xff0c;“月黑雁飞高&#xff0c;单于夜遁逃。欲将轻骑逐&#xff0c;大雪满弓刀。”诗中的慷慨激昂&#xff0c;热血炙烈&#xff0c;千年来让无数国人心魂激荡。 时代变迁&#xff0c;岁月迁移&#xff0c;今…

LeetCode面向运气之Javascript—第20题-有效的括号-95.97%

LeetCode第20题-有效的括号 题目要求 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号…

卑微小测试的一天----自动生成正交法测试用例

前言 工作过程中&#xff0c;我们接触到需求后第一要务是 熟悉需求并且输出测试用例&#xff0c;针对接口测试的入参测试&#xff0c;需要校验大量入参的组合场景&#xff0c;这时我们通常采用正交法来设计测试用例&#xff0c;在减少测试用例的数量时&#xff0c;同时保障测试…

Java 命名规范

包命名规范 包(Package) 的作用是将功能相似或相关的类或者接口进行分组管理&#xff0c;便于类的定位和查找&#xff0c;同时也可以使用包来避免类名的冲突和访问控制&#xff0c;使代码更容易维护。通常&#xff0c;包名使用小写英文字母进行命名&#xff0c;并使用 “.” 进…

LeetCode——半有序排列

一、题目 2717. 半有序排列 - 力扣&#xff08;Leetcode&#xff09; 给你一个下标从 0 开始、长度为 n 的整数排列 nums 。 如果排列的第一个数字等于 1 且最后一个数字等于 n &#xff0c;则称其为 半有序排列 。你可以执行多次下述操作&#xff0c;直到将 nums 变成一个 …

LeetCode_前缀树_困难_212.单词搜索 II

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xf…

网络安全学术顶会——SP 2023 议题清单、摘要与总结(中)

注&#xff1a;本文由ChatGPT与Claude联合生成 51、Effective ReDoS Detection by Principled Vulnerability Modeling and Exploit Generation 正则表达式拒绝服务攻击&#xff08;ReDoS&#xff09;是一种算法复杂度攻击。对于易受攻击的正则表达式&#xff0c;攻击者可以精心…

kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun&#xff08;方法 / 函数&#xff09;函数参数默认值…

MindMapper 思维导图 21.x

MindMapper 可视化绘图软件是任何想要快速组织思想和想法的人的必备工具。MindMapper 具有易于使用的界面&#xff0c;可以轻松创建可用于头脑风暴、决策制定和项目管理的综合思维导图。MindMapper 还是一个非常强大的生产力工具&#xff0c;因为它允许用户跟踪他们在项目和任务…

Linux GCC,GDB,Shell脚本的简单使用

这里写目录标题 GCC命令GDB命令Shell脚本 GCC命令 GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由GNU开发的编程语言译器 编译一个简单的.c程序&#xff1a; 四步分开写&#xff1a; gcc -E -o hello.i hello.c // 预处理 gcc -S -o he…

49、基于51单片机无刷电机调速系统设计(程序+原理图+PCB图+英文文献+参考论文+开题报告+元器件清单等)

摘 要 由于电机的发展&#xff0c;电动机由之前的带有刷子变换为无刷子直流电动机&#xff0c;其内部结构是电子换向器&#xff0c;而不是传统的机械式换向器&#xff0c;电动机的组成为永磁材料制造的转子和带有线圈绕组的定子组成。 所以本论文思路在全面分析无刷直流电机…

Tuleap ,一个用于软件项目管理的平台

Eclipse 基金会使用 Tuleap 取代了 Bugzilla,Tuleap 是一个独特的开源项目管理工具&#xff0c;目前发展势头很好&#xff0c;现在&#xff0c;每个月它会出一个大版本。它还被列在2015 年五大开源项目管理工具和 2016 年十一个名列前茅项目管理工具中。 Manuel Vacelet 是开发…

【MySQL】一文带你了解MySQL的基础知识

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

【Docker】docker部署springboot+vue+mysql+nginx前后端分离项目【实战篇】

文章目录 1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean package打包后端jar并上传到服务器编写Dockfilebuild 构建查看构建的后端镜像app …

51单片机读取DS18B20温度传感器

1.首先我们知道DS18B20是单总线协议&#xff0c;只有一根数据线。所以Data数据线即使发送端又是接收端&#xff0c;同时DS18B20内部接了弱上拉电阻&#xff08;如图一所示&#xff09;&#xff0c;数据线默认为高电平。有了这些概念&#xff0c;我们就能进行下一步。 图一&…

1738_创建自己的simulink模块库

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

随着网络犯罪策略的转变,暗网威胁瞄准能源行业

根据 Searchlight Cyber 的一份报告&#xff0c;能源行业越来越多地通过暗网上的活动成为恶意行为者和威胁组织的目标。 该报告详细介绍了威胁行为者出售全球能源组织初始访问权的众多实例。 其中包括美国、加拿大、英国、法国、意大利和印度尼西亚的流行暗网论坛&#xff08…

使用AIGC工具巧用Linux系统

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【Python爬虫开发基础③】Python基础(文件操作方法汇总)

友情提示&#xff1a;由于本专栏的文章偏向于爬虫&#xff0c;所以对于python的介绍不可能面面俱到&#xff0c;在这里只讲重点。 如果大家觉得有没讲到的地方&#xff0c;欢迎补充~ 往期推荐&#xff1a; 【Python爬虫开发基础①】Python基础&#xff08;变量及其命名规范&…

黑马Redis视频教程高级篇(三:最佳实践)

目录 一、Redis键值设计 1.1、优雅的key结构 1.2、拒绝BigKey 1.2.1、BigKey的危害 1.2.2、如何发现BigKey 1.2.3、如何删除BigKey 1.3、恰当的数据类型 例1&#xff1a;比如存储一个User对象&#xff0c;我们有三种存储方式&#xff1a; 例2&#xff1a;假如有hash类…