当前位置: 首页 > news >正文

代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

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

文章链接:代码随想录 (programmercarl.com)

思路:

(1)首先如果要处理相邻两个节点的话,一定需要操作两个节点的前一个节点才可以,因此,本题需要设定一个虚拟头节点

(2)两两交换节点后,原有的链表就断了,因此需要对链表的节点进行存储

(3)基于此,应该使用双指针,pre指向dummynode(虚拟头节点),cur指向一开始的头节点

(4)注意循环条件,因为涉及到cur.next.next,因此要确保cur和cur.next不为空,否则会报错

Java代码:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {//先判断特殊情况if(head == null){return head;}//定义一个虚拟头节点ListNode dummynode = new ListNode();dummynode.next = head;//双指针ListNode pre = dummynode;ListNode cur = head;while(cur != null && cur.next != null){//保存节点2ListNode temp0 = cur.next;//保存节点3ListNode temp1 = cur.next.next;//开始指向节点pre.next = temp0;temp0.next = cur;cur.next = temp1;pre = cur;cur = temp1;}return dummynode.next;}
}

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

文章链接:代码随想录 (programmercarl.com)

思路:单指针和双指针(利用对称性)都可以操作,看代码注释,其中双指针代码自己又犯了相同的错误,错误如下

(1)错误1是在最后定位好pre,cur指针位置后,直接就写了pre.next = cur,如果此时链表为[1],那么pre = dummynode,cur = head,此时pre.next = cur,根本就没有删除

(2)错误2是在初始化cur位置后开始同时移动pre和cur时的循环条件写错,应该写成cur.next != null,不然pre指针会多走一个位置

Java代码:(单个指针)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//先判断特殊情况if(head == null){return head;}//设置一个虚拟头节点ListNode dummynode = new ListNode();dummynode.next = head;//定义一个指针ListNode cur = dummynode;//统计链表有多少个节点int size = 0;while(cur != null){cur = cur.next;size++;}//重置指针位置cur = dummynode;//找到要删除的节点的前一个节点for(int i = 0;i < size -1 - n;i++){cur = cur.next;}//保存删除节点的后一个节点ListNode temp = cur.next.next;cur.next = temp;return dummynode.next;}
}

Java代码:(双指针)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//先判断特殊情况if(head == null){return head;}//设置一个虚拟头节点ListNode dummynode = new ListNode();dummynode.next = head;//双指针ListNode pre = dummynode;ListNode cur = dummynode;//初始化cur指针位置,对称位置for(int i = 0; i < n;i++){cur = cur.next;}//此时开始同时移动pre和cur指针while(cur.next != null){cur = cur.next;pre = pre.next;}//此时pre指针指向要删除节点的前一个节点//这里无需判断pre.next是否为空,因为cur指针在pre后面,前面的while循环已经判断过了ListNode temp = pre.next.next;pre.next = temp;return dummynode.next;}
}

面试题 02.07. 链表相交

文章链接:代码随想录 (programmercarl.com)

思路:

(1)首先先计算两个链表的长度,并且定义两个指针,通过移动指针,让两个链表对齐开始遍历

(2)默认定义指针cur1指向长链表,指针cur2指向短链表

(3)从长度一致的地方开始同时遍历

Java代码:(看代码注释)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//默认cur1指针指向长链表,cur2指针指向短链表ListNode cur1 = headA;ListNode cur2 = headB;//先计算两个链表的长度int lenA = 0;int lenB = 0;while(cur1 != null){lenA++;cur1 = cur1.next;}while(cur2 != null){lenB++;cur2 = cur2.next;}//计算完长度后,重置一下两个指针cur1 = headA;cur2 = headB;//因为不知道哪个链表更长,因此默认cur1指针指向长链表,cur2指针指向短链表//假设lenB比lenA要长if(lenB > lenA){//先交换长度int templen = lenA;lenA = lenB;lenB = templen;//再交换两个指针ListNode temp = cur1;cur1 = cur2;cur2 = temp;}//开始对齐指针,让长链表的指针往后移动lenA - lenB个步数int gap = lenA - lenB;while(gap > 0){cur1 = cur1.next;gap--;}//此时已经对齐while(cur1 != null && cur2 != null){//有相交的节点if(cur1 == cur2){return cur1;}cur1 = cur1.next;cur2 = cur2.next;}//没有相交的节点return null;}
}

142.环形链表||

文章链接:代码随想录 (programmercarl.com)

思路:此题本质上是个数学题,定义快慢指针,fast指针走过的节点数 = slow指针走过的节点数 * 2

        类似于数学上的追逐问题,想要找到节点,首先需要进行画图分析,在获取到x = z这个信息后,就知道了要用双指针来首先找到快慢指针在环中相遇的地方,后面在重新定义一个指针index,让 index 指针以步长1和slow指针依次遍历,两者相遇就找到了环的入口。

Java代码:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {//先判断特殊情况if(head == null){return head;}//定义快慢指针,快指针步长为1,慢指针步长为2ListNode fast = head;ListNode slow = head;//先找到两个指针相遇的节点位置while(slow != null && fast != null && fast.next != null){slow = slow.next;fast = fast.next.next;//找到了两个指针在环内相遇的位置if(slow == fast){ListNode index = head;while(slow != null && index != null){//找到了入环的第一个节点if(slow == index){return index;}index = index.next;slow = slow.next;}}}//没有找到,返回Nullreturn null;}
}

相关文章:

代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

24.两两交换链表中的节点 文章链接&#xff1a;代码随想录 (programmercarl.com) 思路&#xff1a; &#xff08;1&#xff09;首先如果要处理相邻两个节点的话&#xff0c;一定需要操作两个节点的前一个节点才可以&#xff0c;因此&#xff0c;本题需要设定一个虚拟头节点 …...

我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章

我想有很多人开了博客&#xff0c;但想不起来写作&#xff0c;无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容&#xff0c;并将其与您想要编写的内容很好地匹配。 这一次&#xff0c;我…...

嵌入式C语言设计模式 --- 外观模式

1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…...

若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

昨天情人节一(&#xffe3;︶&#xffe3;*)) 送给赛利亚一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面&#xff1a; 干干净净贼舒服一Ψ(&#xffe3;∀&#xffe3;)Ψ——Ψ(&#xffe3;∀&#x…...

SCI论文写作神器集合 —— 超级实用

特此声明&#xff1a; 本文拷贝多处别人的内容&#xff0c;并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具&#xff0c;旨在帮助小伙伴们更快更有效率的完成文章发表&#xff0c;如果其他好用的工具&#xff0c;欢迎各位交流~~ 一、文献搜索神…...

MAC 系统安装多版本 JDK 并任意切换

1、背景 在进行 Java 开发的过程中&#xff0c;我们可能需要使用不同版本的 JDK。例如&#xff1a;一些旧的 Java 应用程序只能在旧版本的 JDK 上运行&#xff0c;而一些新的 Java 应用程序需要较新的 JDK 才能运行。 在 MAC 系统上&#xff0c;如何安装多个版本的 JDK 并配置…...

配置 Smart Link 接口时需注意的互斥命令

配置 Smart Link 接口时需注意的互斥命令 一、接口加入Smart Link组功能与以下功能互斥一、接口加入Smart Link组功能与以下功能互斥 注&#xff1a;当接口已经加入Smart Link组&#xff0c;则不能再配置以下功能&#xff1b;反之&#xff0c;当接口已经配置以下功能&#xff…...

QT的下载和安装

这里介绍的是QT官方方式下载&#xff0c;每次都让我很糊涂&#xff0c;就记载一下。先是下载QT online installerhttps://www.qt.io/download 在下方有Go Open Sourcehttps://www.qt.io/download-open-source 在下方有Download the Qt Online installerhttps://www.qt.io/downl…...

nacos配置中心与服务注册中心

文章目录 目录 文章目录 前言 一、服务注册与发现中心 二、配置中心 总结 前言 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一&#xff0c;负责服务注册发现和服务配置. [服务治理的作用和微服务配置管理] Na…...

UE4 手把手教你做插件(1) 从代码引用插件

0&#xff0c;前言 我看的是 技术宅阿棍儿 的视频&#xff0c;B站有。 系列视频&#xff1a;从代码引用插件_哔哩哔哩_bilibili 看不懂&#xff0c;只能边查资料边看&#xff0c;讲的顺序有点乱 1&#xff0c;根据视频提示创建第三方插件 注意&#xff1a;如果只有空白插件的情…...

【Mybatis源码解析】一级缓存和二级缓存源码解析

文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》&#xff0c;主要讲解了Mybatis的基本原理一级执行的流程&#xff0c;这一章来讲一下Mybatis的两个缓存&#xff1a;一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…...

你知道MES实施的要点吗?

随着国家行动纲领&#xff1a;中国制造2025&#xff08;智能制造&#xff09;的发布&#xff0c;MES系统在制造业的工厂中所占比重越来越大&#xff0c;越来越多的工厂选择使用MES完成工厂的信息化、数字化、智能化生产。伴随着企业对MES的需求不断增大&#xff0c;生产MES的厂…...

告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢

统计一张表的总数量&#xff0c;是我们开发中常有的业务需求&#xff0c;通常情况下&#xff0c;我们都是使用 select count(*) from table SQL 语句来完成。随着业务数据的增加&#xff0c;你会发现这条语句执行的速度越来越慢&#xff0c;为什么它会变慢呢&#xff1f; 为什…...

Redis 命令和Redis key键

Redis 命令 Redis 命令用于在 Redis 服务器上执行一些操作&#xff0c;而命令运行的方式是通过客户端命令行来执行的&#xff0c;这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令&#xff0c;您首先需要开启一个 Redis 客户端。操作方法如下&#xff1a; …...

如何入侵服务器

根据中华人民共和国刑法&#xff1a; 第二百八十六条违反国家规定&#xff0c;对计算机信息系统功能进行删除、修改、增加、干扰&#xff0c;造成计算机信息系统不能正常运行&#xff0c;后果严重的&#xff0c;处五年以下有期徒刑或者拘役&#xff1b;后果特别严重的&#xff…...

在Windows10上安装虚拟机---VMware 17 Pro下载与安装

在Windows10上安装虚拟机---VMware下载与安装0 前言1 下载VMware 17 pro2 安装VMware 17 Pro3. 打开Vmware0 前言 电脑原生系统&#xff1a;Windows10虚拟机软件&#xff1a;VMware 17 pro准备好安装虚拟机的文件夹路径 1 下载VMware 17 pro 下载网址&#xff1a;VMware 官网…...

生命周期函数、组件

1. 生命周期函数 beforeCreate &#xff1a; 无法通过 vm 访问data 中的数据、methods 中的方法created &#xff1a;可以访问 vm 中的 data 的数据&#xff0c; methods 中的方法beforeMount&#xff1a;为经 Vue 编译的 dommounted&#xff1a;经过 vue 编译的 dom &#x…...

蓝桥杯 stm32 PWM 测量频率

本文代码使用 HAL 库。 文章目录 前言一、PWM 原理图:二、CubeMX 创建工程:三、PWM 单路测频:四、详细代码:1. 获取 CNT函数。2. 设置CNT为 0 函数3. 开启TIM2_CH1的输入捕获中断函数4. TIM 回调函数5. 在 LCD 上显示 R40 和 R39 的频率。总结前言 一、PWM 原理图: 参考…...

Docker CPU 资源控制

01-本章背景知识 在生产环境里运行服务的一个主要问题是如何公平有效的进行资源分配。 1、Docker 容器使用核心操作系统的 Cgroups 管理容器的 CPU资源分配。 2、Docker 容器资源竞争时&#xff0c;默认使用简单均分&#xff08;CFS&#xff09;算法。 3、Docker 容器也可以根…...

小红书数据平台:笔记爆文率提升的三大秘诀公式!

导语 对于小红书商家 / 博主来说&#xff0c;写出爆文就像买彩票&#xff0c;根本不能预知哪一篇会爆。2023年&#xff0c;小红书哪些内容会脱颖而出呢&#xff1f;我们又该如何把握热点趋势&#xff0c;实现优质内容转化出爆文~ 美妆作为小红书的长红赛道&#xff0c;本文我…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...