代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160.链表相交、142.环形链表II

2023/9/30 17:46:09
  1. 两两交换链表中的节点 题目链接
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

方法:

  • 递归
    返回值:交换完成的子链表
    调用单元:设需要交换的两个点为 head 和 next,head 连接后面交换完成的子链表,next 连接 head,完成交换
    终止条件:head 为空指针或者 next 为空指针,也就是当前无节点或者只有一个节点,无法进行交换
class Solution {
    public ListNode swapPairs(ListNode head) {
        // 递归终止    条件:head 为空指针或者 next 为空指针,也就是当前无节点或者只有一个节点,无法进行交换
        if (head == null || head.next == null) {
            return head;
        }
        ListNode next = head.next;
        // head 连接后面交换完成的子链表
        head.next = swapPairs(next.next);
        // next 连接 head,完成交换
        next.next = head;
        // 新头节点
        return next;
    }
}
  • 非递归写法
class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 虚拟头节点
        ListNode dummyNode = new ListNode(-1, head);
        ListNode pre = dummyNode;
        while(pre.next != null && pre.next.next != null){
            // 俩节点互换前先临时保存后面子链的头节点
            ListNode tempNode = head.next.next;
            // 第一步 虚拟节点指向2节点(第一个例子)
            pre.next = head.next;
            // 第二步 2节点指向1节点
            head.next.next = head;
            // 第三步 1节点指向临时保存的3节点
            head.next = tempNode;
            // 更新pre和head,继续循环
            pre = head;
            head = tempNode;
        }
        return dummyNode.next;
    }
}

19.删除链表的倒数第N个节点 题目链接
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

思路:

  • 最容易想到的思路是,先计算链表的长度L,然后第 L-n+1 个节点就是要删除的节点;遍历到L-n的位置,就可以删除第L-n+1个节点了
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int len = getLength(head);
        // 虚拟头节点
        ListNode dummyNode = new ListNode(-1, head);
        ListNode pre = dummyNode;
        // 找到第len-n+1个节点的前驱节点
        for (int i = 0; i < len - n ; i++) {
            pre = pre.next;
        }
        pre.next = pre.next.next;
        return dummyNode.next;
    }
    private int getLength(ListNode head) {
        if (head == null) {
            return 0;
        }
        ListNode cur = head;
        int result = 0;
        while(cur != null) {
            result++;
            cur = cur.next;
        }
        return result;
    }
}
  • 前后指针确定删除节点位置
    创建指向head的虚拟头结点dummyNode,前指针指向dummyNode,后指针指向前指针移动n+1步后的位置,然后俩指针同时每次步进1,直到后指针指向null,此时前指针指向了要删除的节点的前驱节点
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyNode = new ListNode(-1, head);
        ListNode frontNode = dummyNode;
        ListNode backNode = dummyNode;
        // 后指针backNode向后移动n+1步
        for (int i = 0; i <= n; i++) {
            backNode = backNode.next;
        }
        // 前后指针同时移动,直到backNode指向null,此时front指针指向了要删除的节点的前驱节点
        while (backNode != null) {
            frontNode = frontNode.next;
            backNode = backNode.next;
        }
        // 开始删除节点
        frontNode.next = frontNode.next.next;
        return dummyNode.next;
    }
}

160.链表相交
题目链接 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
思路:

  • 最容易想到的思路是,利用哈希集合的contains方法:把一个链表的节点全部存入hashSet中,然后遍历另一个链表,如果某节点存在于hashSet中,说明该节点就是相交节点
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        HashSet<ListNode> setA = new HashSet<>();
        ListNode cur = headA;
        while (cur != null) {
            setA.add(cur);
            cur = cur.next;
        }
        cur =  headB;
        while (cur != null) {
            if (setA.contains(cur)) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }
}

142.环形链表II
题目链接
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

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

不允许修改 链表。

思路:推导过程较复杂,先记着思路
第一步:快慢指针指针指向头节点,慢指针步进1,快指针步进2,如果相遇则链表有环,否则不然;
第二部:有环后,一个指针指向头节点,一个指针指向头节点,一个指针指向第一步的相遇点,然后俩指针同时步进1,新的相遇点即为入环点;

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        // fast指向无环链表最后一个节点或者fast指向null结束
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            // 相遇有环
            if (slow == fast) {
                ListNode fisrtNode = head;
                ListNode meetingNode = slow;
                while (fisrtNode != meetingNode) {
                    fisrtNode = fisrtNode.next;
                    meetingNode = meetingNode.next;
                }
                return meetingNode;
            }
        }
        return null;
    }
}

http://www.jnnr.cn/a/139766.html

相关文章

算法课实验报告解析(4班供参考)

有两个题1.第一题2.第二题1.第一题 &#x1f60b;题目描述&#xff1a; 给定一个整数数组A(ao&#xff0c;a1&#xff0c;…,an-1),若岗且ai>aj&#xff0c;则<ai.aj>就为一个逆序对。例如数组&#xff08;3,1,4,5,2,&#xff09;的逆序对有<3,1>、< 3,2>…

带你Java入门(Java系列1)

目录 前言&#xff1a; 1.什么是Java 2.Java的语言特点 3.初识Java的main方法 4.注释 5.标识符 6.关键字 7.1基本数据类型 7.2引用数据类型 8.变量 8.1.整形变量 8.2.长整形变量 8.3浮点型变量 8.3.1单精度浮点型 8.3.2双精度浮点型 8.4字符型变量 8.5布尔型…

nodejs express 的基本使用

测试需要快速过一遍express的基本使用方法 直接安装express使用 express和koa的区别](https://zhuanlan.zhihu.com/p/372128788)egg.js企业级开发框架 npm install exress --save可以使用express-generator生成项目框架 $ npx express-generatorwarning: the default view …

基于stm32单片机随机数自动摇号抽奖系统

资料编号&#xff1a;099 下面是相关功能视频演示&#xff1a; 99-基于stm32单片机随机数自动摇号抽奖系统&#xff08;源码仿真全套资料&#xff09;采用stm32单片机作为主控&#xff0c;LCD1602显示&#xff0c;通过按键来重置生成随机数&#xff0c;类似于摇号和抽奖系统 …

SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)

目录 1、总帐科目 1.1编辑科目表清单 1.2 科目表分配给公司代码 1.3 定义科目组 1.4 定义留存收益科目 2、销售/购置税 2.1 维护销售/购置税务代码税率 2.2 配置销项/销项税会计科目 大家好本篇是&#xff1a;SAP S4 FI后台详细配置教程- PART4 &#xff08;科目及税…

数据结构-双链表思路解析及代码实现

双链表是单链表的进阶版&#xff0c;单链表是1-2-3-4 一个个排排坐链接&#xff0c;只管向后拉手&#xff0c;其主要思想是当前节点与下一节点的关系&#xff0c;那么双链表就多了一层关系&#xff0c;当前节点不仅和一下一点连起来&#xff0c;也要和上一节点串联起来。与前与…

LeetCode刷题复盘笔记—一文搞懂62. 不同路径 63. 不同路径 II(动态规划系列第三篇)

今日主要总结一下动态规划的两道题目&#xff0c;62. 不同路径 && 63. 不同路径 II 题目一&#xff1a;62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或…

PyQT6 pip install (三) 百篇文章学PyQT

本文章是百篇文章学PyQT的第三篇&#xff0c;本文讲述如何使用PIP安装PyQT6&#xff0c;PyQT6在安装过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决方案、怎么…

[计算机毕业设计]改进粒子群算法的监测资源调度

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

PTA题目 计算分段函数[3]

本题目要求计算下列分段函数f(x)的值&#xff1a; 输入格式&#xff1a; 输入在一行中给出实数x。 输出格式&#xff1a; 在一行中按“f(x) result”的格式输出&#xff0c;其中x与result都保留一位小数。 输入样例1&#xff1a; 10输出样例1&#xff1a; f(10.0) 0.1输…

服务器常用的异常及性能排查

服务器常用的异常及性能排查 使用 top 命令查看性能指标 top 命令使用详细介绍&#xff1a;传送门 查看Tasks total 进程数 正常我们在使用过程中对每天的一个进程数大概是有一个谱的&#xff0c;比如正常就是1百多个&#xff0c;突然暴增几百&#xff0c;那就很明显这里有…

大数据之——Hive

目录1. Hive 基本概念1.1 什么是 Hive1.2 Hive 的优缺点1.2.1 优点1.2.2 缺点1.3 Hive 架构原理2. Hive 安装2.1 Hive 安装地址2.2Hive 安装部署2.3MySQL 安装2.4 Hive 元数据配置到 MySQL2.4.1 拷贝驱动2.4.2 配置 Metastore 到 MySQL2.4.3 再次启动 Hive2.5 使用元数据服务的…

[附源码]java毕业设计汽车租赁管理系统-

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ArcGIS计算图斑四至坐标原来这么简单!可不要在走弯路哦

时常我们需要去计算图斑的四至坐标 &#xff08;四至与四至点不一样哦&#xff09; 很多朋友会去求个 最小边界几何 在与原始图斑相交得到点来算四至 这种方法有许多问题 是不可以取的&#xff0c;我们今天来介绍一下 一个简单的字段计算就解决这个问题 然后嫌麻烦 我们…

基于python的校园社团管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

【Java第31期】:Spring中存储Bean的注解以及用法

作者&#xff1a;有只小猪飞走了 博客地址&#xff1a;https://blog.csdn.net/m0_62262008?typeblog 这期内容&#xff1a;揭开Bean存储的神秘面纱 文章目录前言一&#xff0c;Controller&#xff08;控制存储&#xff09;二&#xff0c;Service&#xff08;服务存储&#xff…

java进阶编程思想(七天)

编程核心思想基本框架第一天&#xff08;继承&#xff09;第二天&#xff08;抽象和接口&#xff09;第四天&#xff08;多态、DATA、Object、正则&#xff09;第五天&#xff08;遍历、Set、斗地主游戏案例&#xff09;第六天第七天b站链接:懂不懂我意思明不明白哈哈哈基本框架…

【Mysql】Mysql的数据类型

文章目录数据类型数据类型总体介绍数值类型tinyint类型bit类型小数类型字符类型char类型varchar类型日期和时间类型enum set数据类型 数据类型总体介绍 所谓的数据类型:对数据进行统一的分类,从系统的角度出发是为了使用统一的方式进行管理,更好的利用有限的空间,其次还可以约…

frp内网穿透服务

参考博客&#xff1a; https://www.jianshu.com/p/19ea81efffc4 https://blog.csdn.net/yj222333/article/details/124752420 依赖于&#xff1a;Github开源软件FRP 下载地址&#xff1a;https://github.com/fatedier/frp/releases frp 主要由 客户端(frpc) 和 服务端(frps…

Linux之手把手教你捋清楚make和makefile

文章目录背景简单介绍make和makefile依赖关系和依赖方法项目清理以及伪目标背景 以往的C语言编程&#xff0c;我们一般都在一些像VS2019这样的集成开发环境(IDE)下编写&#xff0c;一个工程中的源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0…
最新文章