力扣143重排链表
143. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

输入:head = [1,2,3,4]
输出:[1,4,2,3]

输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]
解:
最初我是这样来写的:
class Solution {public void reorderList(ListNode head) {if (head == null || head.next == null) return;List<ListNode> list = new ArrayList<>();ListNode node = head;while (node != null) {list.add(node);node = node.next;}int i = 0, j = list.size() - 1;while (i < j) {list.get(i).next = list.get(j);i++;list.get(j).next = list.get(i);j--;}list.get(i).next = null; }
}
观看题解后发现,好嘛,还能这么干。

那我们就很明确了,先找到中间节点、再将后半部分反转、接下来交叉合并。
寻找链表的中间节点
这一步呢十分的简单,只需要一个快慢指针就可以解决。
设置一个慢指针一次走一步,设置一个快指针一次走两步。最后快指针走到头,慢指针的位置就是节点的中间位置了。
public ListNode findMidNode(ListNode head){ListNode fast = head;ListNode slow = head;while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}return slow;}
但是这时候有个问题,代码中判断条件上判断了两次fast。fast.next != null && fast.next.next != null
Q:这是为什么呢?
A:引入如果不检查下一个节点是否为空,直接跳两步,就很可能造成空指针异常
快指针每次移动两步(fast = fast.next.next),但移动的前提是:
第一步:fast.next 必须存在(否则无法访问 fast.next.next)。
第二步:fast.next.next 必须存在(否则第二步会指向 null)。
因此,循环条件必须确保这两个节点均非空,才能让快指针安全跳跃。
并且!顺序一定要先判断fast.next再判断fast.next.next
反转链表
public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;while(cur != null){ListNode temp = cur.next; //防止断层,先存起来cur.next = pre; //指向前一个,反转//进行下一次循环pre = cur; //下一次循环中,pre为当前元素cur = temp; // 下一次循环中,cur为当前元素的下一个。为什么不用cur.next呢?因为我们进行了反转操作,所以找不到下个了,这也是我们之前暂存cur.next的原因。}return pre;}
反转链表也比较好理解,重要的就是要存下来下一个节点

首先我们来想,反转链表不就是1指向null,2指向1,3指向2吗?
所以直接让pre = null,cur =1
反转不就是cur.next = pre (1->null)
那接下来呢?我们想一想,接下来是不是就应该让2指向1了
好那就让pre = 1,cur = 2
反转不也是cur.next = pre(2->1)
没问题吧,那我们来解决pre和cur是怎么变成1和2的。
pre=1,这个并不难,让pre = cur(在第一步cur=1的时候)就可以解决了
那cur=2呢?2是我们正常链表中1的下一个也就是1.next = 2。但是我们在上面已经把1和2切断了。链表变成了1->null 2->3->4->5
那我们是不是可以在一开始可以用一个ListNode先暂存起来2,也就是1.next
ok那我们来梳理一下,核心代码是不是就出来了
ListNode temp = cur.next; //防止断层,先存起来
cur.next = pre; //指向前一个,反转
//进行下一次循环的赋值
pre = cur; //下一次循环中,pre为当前元素
cur = temp; // 下一次循环中,cur为当前元素的下一个。为什么不用cur.next呢?因为我们进行了反转操作,所以找不到下个了,这也是我们之前暂存cur.next的原因。
交叉合并
交叉合并的代码就很简单了
public void mergeList(ListNode l1,ListNode l2){ListNode l1t;ListNode l2t;while (l1 != null && l2 != null) {l1t = l1.next;l2t = l2.next;l1.next = l2;l1 = l1t;l2.next = l1;l2 = l2t;}}

第一步我们是不是直接l1.next=l2即可。也就是1->5
那接下来,我们怎么怎么让l1指向2呢?
所以我们在前面需要暂存temp1 = l1.next
让l1 = temp1;接下来l2.next = l1就可以了
那l2又怎么指向4呢?和前面一样temp2 = l2.next,l2 = temp2即可
所以也就有了我们上面的核心代码
l1t = l1.next;
l2t = l2.next;l1.next = l2;
l1 = l1t;l2.next = l1;
l2 = l2t;
相关文章:
力扣143重排链表
143. 重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的…...
【GPT入门】第24课 langfuse介绍
【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…...
HarmonyOS NEXT个人开发经验总结
文章目录 1. 开发环境配置1.1 工具链安装流程1.2 环境配置代码 2. 项目架构设计2.1 分层架构图2.2 模块化配置 3. 核心开发实践3.1 声明式UI开发3.2 分布式数据管理 4. 性能优化策略4.1 性能优化流程图4.2 优化实践代码 5. 安全与权限管理5.1 权限申请流程5.2 安全存储示例 6. …...
Python基于深度学习的多模态人脸情绪识别研究与实现
一、系统架构设计 A[数据采集] --> B[预处理模块] B --> C[特征提取] C --> D[多模态融合] D --> E[情绪分类] E --> F[系统部署] F --> G[用户界面] 二、数据准备与处理 1. 数据收集 - 视频数据:FER2013(静态图像࿰…...
golang快速上手基础语法
变量 第一种,指定变量类型,声明后若不赋值,使用默认值0 package mainimport "fmt"func main() {var a int //第一种,指定变量类型,声明后若不赋值,使用默认值0。fmt.Printf(" a %d\n"…...
【MySQL】多表操作 —— 外键约束
目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…...
⭐算法OJ⭐两数之和【哈希表】(C++ 实现)Two Sum
“两数之和”(Two Sum)是一道非常经典的算法题目,几乎是算法入门和面试准备的必做题之一。它的经典性体现在以下几个方面: 1. 算法入门的基础题目 这道题目是许多初学者接触 哈希表(Hash Table) 或 字典&…...
从被动响应到主动预见:智能可观测性技术的变革与实践
思维导图 一、引言 🌃 想象一下,在一个深夜 🌙,你的关键业务系统突然出现故障 🚨。传统情况下,你可能会收到大量不相关的告警 📱💬💬💬,然后花费数小时甚至数天时间 ⏳,在错综复杂的系统架构中寻找根本原因 🔍。而在智能可观测性的世界里,故障发生前系统…...
【GPT入门】第22课 langchain LCEL介绍
【GPT入门】第22课 langchain LCEL介绍 1. LCEL介绍与特点2. 原生API与LCEL的对比2. 简单demo 1. LCEL介绍与特点 LCEL 即 LangChain Expression Language,是 LangChain 推出的一种声明式语言,用于简化和优化在 LangChain 框架内构建复杂链和应用的过程…...
LeetCode1005☞K次取反后最大的数组和
关联LeetCode题号1005 本题特点 贪心:局部最优解:将负数取反得到比原值大的值,进而全局最优解整体和为最大二次贪心: 如果取反次数大于负数个数,那么剩下次数如果为奇数,那么就将绝对值最小的数取反(贪心…...
7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)
基于光线投射原理实现的体渲染 一、什么是体绘制?二、为什么不直接用3D模型渲染三、原理及部分代码解析1、什么是光线?2、什么是光线投射?3、为什么需要光线投射3D纹理?4、为什么必须是3D纹理?5、为什么还需要1D纹理&a…...
二、vtkCommand的使用
一、概述 vtkCommand是VTK中的一个重要的类,用于处理事件和回调机制。它允许用户在特定事件发生时执行自定义的操作,例如在交互操作、数据更新或渲染过程中触发某些功能。 二、主要功能 1、事件处理:vtkCommand用于监听和处理VTK管线中的各…...
Git的详细使用方法
Git 是一个分布式版本控制系统,用于跟踪和管理代码的变更。以下是 Git 的详细使用方法: 1. 安装 Git Windows:从 Git 官网 下载安装包。 Linux(Ubuntu/Debian) sudo apt install git macOS: 使用 Homebr…...
在 Windows 上使用 choco 安装 mkcert 并配置 Vue 运行HTTPS
解决在Windows上使用Vue本地运行HTTPS的问题,vue-cli或vite都可以使用 步骤 1:确认 Chocolatey 是否已安装 1. 检查 choco 命令是否可用 打开 PowerShell(管理员权限),输入: choco -v如果显示版本号(如…...
spring声明式事务原理01-调用第1层@Transactional方法(事务访问入口)
文章目录 【README】【步骤1】UserAppService调用userSupport.saveNewUser()【步骤2】获取到TransactionInterceptor【步骤3】chain不为空,接着执行CglibMethodInvocation#proceed方法【补充】AopContext作用 【步骤4】CglibMethodInvocation#proceed方法【步骤5】调…...
Qt-D指针与Q指针的设计哲学
文章目录 前言PIMLP与二进制兼容性D指针Q指针优化d指针继承Q_D和Q_Q 前言 在探索Qt源码的过程中会看到类的成员有一个d指针,d指针类型是一个private的类,这种设计模式称为PIMPL(pointer to implementation),本文根据Q…...
数据结构——单链表list
前言:大家好😍,本文主要介绍数据结构——单链表 目录 一、单链表 二、使用步骤 1.结构体定义 2.初始化 3.插入 3.1 头插 3.2 尾插 3.3 按位置插 四.删除 4.1头删 4.2 尾删 4.3 按位置删 4.4按值删 五 统计有效值个数 六 销毁…...
java 的标记接口RandomAccess使用方法
在 Java 中,RandomAccess 是一个标记接口(marker interface),用于标识实现该接口的 List 实现类支持快速(通常是常数时间复杂度 O(1))的随机访问。常见的实现类包括 ArrayList,而不包括 LinkedL…...
基于PHP的网店进销存管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 相比于以前的传统进销存管理方式,智能化的管理方式可以大幅降低进销存管理的运营人员成本,实现了进销存管理的标准化、制度化、程序化的管理,有效地防止了商品信息及仓库信息的随意管理,提高了信息的处理速度和精确度&#…...
Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法
Vue3 Pinia $subscribe 可以用来监视Stroe数据的变化 localStorage的用法 localStorage中只能存字符串,所有对象要选转成json字符串 定义store时,从localStorage中读取数据talkList可能是字符串也可能是空数组 Store的组合式写法 直接使用reactiv…...
【PHP】获取PHP-FPM的状态信息
文章目录 一、前言二、环境三、过程1)修改PHP-FPM配置文件2)修改Nginx配置文件3)访问页面4)修改状态页面端口 一、前言 PHP-FPM内置有一个状态页面,通过这个页面可以获取到FPM的一些状态信息(见下图&#…...
(性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化
目录 性能测试工具 性能测试工具 jemeter环境搭建 jmeter的常用目录介绍 jmeter修改语言和主题--jmeter界面的汉化 jmeter元件 jmeter元件和组件的介绍 jmeter的作用域原则 jmeter的执行顺序 案例:执行顺序 jmeter使用案例 jmeter线程组的介绍 jmeter…...
Java 大视界 -- 基于 Java 的大数据实时流处理中的窗口操作与时间语义详解(135)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
数据库的基本知识
目录 一、创建数据库和数据表1.1 创建数据库相关代码1.2 创建数据表1.3 约束条件1.3.1 主键约束1.3.2 非空约束1.3.3 唯一性约束1.3.4 默认约束1.3.5 自增字段 1.4 手工建表 二、数据查询功能2.1 sql 查询的7个关键词2.1.1 select2.1.2 from2.1.3 where2.1.4 group by2.1.5 hav…...
失败的面试经历(ʘ̥∧ʘ̥)
一.面向对象的三大特性 1.封装:将对象内部的属性私有化,外部对象不能够直接访问,但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承:类与类之间会有一些相似之处,但也会有一些异处,使得他们与众…...
【Jmeter】使用教程
下载及安装 参考链接: JMeter下载及安装(附插件及中文包超详细) 参考链接: 【Jmeter】win 10 / win 11:Jmeter 下载、安装、汉化、新机迁移、版本更新(Jmeter 4 以上版本均适用) 分辨率的调整 参考链接: Jmeter5.3字…...
Android 7 及以上夜神模拟器,Fiddler 抓 https 包
文章目录 问题描述解决方案环境准备操作步骤1、导出 Fiddler 证书并修改成 .pem 和 .0 文件2、修改夜神模拟器配置3、打开夜神模拟器设备的 USB 调试选项4、将0725b47c.0证书放入夜神模拟器系统证书目录5、夜神模拟器 cmd 环境配置6、给 0725b47c.0 证书赋予权限7、打开 fiddle…...
全国医院数据可视化分析系统
【大数据】全国医院数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 🏥 项目名:医疗导航神器!——《基于大数据的微医挂号网医院数据可视…...
音视频入门基础:RTCP专题(1)——RTCP官方文档下载
一、引言 实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议。RTCP由《RFC 3550》定义(取代废弃的《RFC 1889》)。RTP使用一个…...
蓝桥杯专项复习——结构体、输入输出
目录 结构体:排序 输入输出 结构体:排序 [NOIP2007]奖学金 #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N310; int n;struct Student {int chinese,math,eng,sum;int idx; }Stu[N];//定…...
