面试算法26:重排链表

问题

给定一个链表,链表中节点的顺序是L0→L1→L2→…→Ln-1→Ln,请问如何重排链表使节点的顺序变成L0→Ln→L1→Ln-1→L2→Ln-2→…?
在这里插入图片描述

分析

首先把链表分成前后两半。在示例链表中,前半段链表包含1、2、3这3个节点,后半段链表包含4、5、6这3个节点。然后把后半段链表反转。示例链表的后半段链表反转之后,节点的顺序变成6、5、4。最后从前半段链表和后半段链表的头节点开始,逐个把它们的节点连接起来形成一个新的链表。先把前半段链表和后半段链表的头节点1和6连接起来,再把处在第2个位置的节点2和5连接起来,最后把两个尾节点3和4连接起来,因此在新的链表中节点的顺序是1、6、2、5、3、4。

可以使用双节点来寻找链表的中间节点。如果一快一慢两个指针同时从链表的头节点出发,快的指针一次顺着next指针向前走两步,而慢的指针一次只走一步,那么当快的指针走到链表的尾节点时慢的指针刚好走到链表的中间节点。

一个值得注意的问题是,链表的节点总数既可能是奇数也可能是偶数。当链表的节点总数是奇数时,就要确保链表的前半段比后半段多一个节点。

public class Test {public static void main(String[] args) {ListNode listNode1 = new ListNode(1);ListNode listNode2 = new ListNode(2);ListNode listNode3 = new ListNode(3);ListNode listNode4 = new ListNode(4);ListNode listNode5 = new ListNode(5);ListNode listNode6 = new ListNode(6);ListNode listNode7 = new ListNode(7);ListNode listNode8 = new ListNode(8);ListNode listNode9 = new ListNode(9);listNode1.next = listNode2;listNode2.next = listNode3;listNode3.next = listNode4;listNode4.next = listNode5;listNode5.next = listNode6;reorderList(listNode1);while (listNode1 != null) {System.out.println(listNode1.val);listNode1 = listNode1.next;}}public static void reorderList(ListNode head) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode fast = dummy;ListNode slow = dummy;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next;if (fast.next != null) {fast = fast.next;}}ListNode temp = slow.next;slow.next = null;link(head, reverseList(temp), dummy);}private static void link(ListNode node1, ListNode node2, ListNode head) {ListNode prev = head;while (node1 != null && node2 != null) {ListNode temp = node1.next;prev.next = node1;node1.next = node2;prev = node2;node1 = temp;node2 = node2.next;}if (node1 != null) {prev.next = node1;}}public static ListNode reverseList(ListNode head) {ListNode prev = null;ListNode cur = head;while (cur != null) {ListNode next = cur.next;cur.next = prev;prev = cur;cur = next;}return prev;}
}

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

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

相关文章

分布式系统部署Redis

文章目录 一、单点问题二、主从模式概念配置主从结构查看主从节点断开从属关系拓扑结构主从复制原理replication复制offset偏移量 全量复制和部分复制全量复制部分复制 实时复制redis主节点无法重启 三、主从哨兵模式哨兵概念监控程序人工恢复自动恢复为什么是哨兵集合使用dock…

数字孪生技术在智慧城市应用的推进建议

(一)坚持需求牵引,强场景重实效 必须始终坚持以人为本、场景导向、需求牵引,站在供给侧结构性改革的角度,突出以用促建,强调建用并重,真正发挥数字孪生城市应用建设的实效。从构建数字孪生创新…

寻找替代Redmine项目管理工具的常见方案

RedMine是一个非常受欢迎的项目管理工具,但它并不是万能的。随着时间的推移,许多功能和特性可能会发生变化或被取消。因此,有许多其他工具可以成为RedMine的替代品。 以下是六种可能的选择: 1、Zoho Projects: Zoho P…

CLIP和改进工作

CLIP和改进工作 CLIP 改进方向 语义分割 Lseg、GroupViT 目标检测 ViLD、GLIP v1/v2 视频理解 VideoCLIP、CLIP4clip、ActionCLIP 图像生成 VQGAN-CLIP、CLIPasso、CLIP-Draw 多模态下游任务 VL Downstream 其他 prompt enginering(CoOp等) depthCLIP、…

Excel 插入和提取超链接

构造超链接 HYPERLINK(D1,C1)提取超链接 Sheet页→右键→查看代码Sub link()Dim hl As HyperlinkFor Each hl In ActiveSheet.Hyperlinkshl.Range.Offset(0, 1).Value hl.AddressNext End Sub工具栏→运行→运行子过程→提取所有超链接地址参考: https://blog.cs…

手撕Vue-编译指令数据

经过上一篇的分析,完成了查找指令和模板的功能,接下来就是编译指令的数据了。 所以本章节主要处理的方法则是 buildElement 方法,我们先分析一下我们所拿到的数据在进行编码,这样会更加清晰一些。 我将 name, value 打印出来&…

【Redis】Zset 有序集合命令

目录 命令ZADDZCARDZRANGEZCOUNTZREVRANGEZRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 命令 ZADD 添加或者更新指定的元素以及关联的分数到zset中,分数应该符合double类型,inf/-inf作为…

JVM八股文

1.JVM的内存结构? 2.OOM是什么,怎么排查? 3.请解释四种引用是什么意思有什么区别? 4.GC的回收算法有哪些? 5.怎么判断对象是否存活? 1.什么是JVM内存结构 jvm将虚拟机分为5大区域,程序计数器、…

计算机网络 | 传输层

计算机网络 | 传输层 计算机网络 | 传输层功能概述UDP协议TCP协议TCP协议的特点TCP报文段TCP连接管理TCP连接的建立TCP连接的释放 TCP可靠传输序号确认重传 TCP流量控制TCP拥塞控制慢开始和拥塞避免快重传和快恢复 第5章总结 参考视频:王道计算机考研 计算机网络 参…

【vim 学习系列文章 10 -- vim 将代码中空格高亮显示方法】

文章目录 vim 高亮空格使用背景如何配置vim 可以自动显示空格呢?vim highlight 命令使用介绍vim 空白行的处理vim match 命令详细介绍 vim 高亮空格使用背景 开发人员在编写代码之后,在review通过之后会将代码推到服务器然后merge,但是有些代…

学习嵌入式系统的推荐步骤:

学习嵌入式系统的推荐步骤: 00001. 选择一款Linux发行版作为主要操作系统,如RedHat、Ubuntu、Fedora等。进入Linux后,使用终端进行任务操作。建议不要使用虚拟机,如有需要可考虑双系统安装。 00002. 00003. 学习C语言、数…

2023年【天津市安全员C证】模拟考试及天津市安全员C证实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证模拟考试是安全生产模拟考试一点通生成的,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2023年【天津市安全员C证】模拟考试及天津市…

云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

文章目录 K8S集群架构解释K8S集群攻击点-重点API Server未授权访问&kubelet未授权访问复现k8s集群环境搭建1、攻击8080端口:API Server未授权访问2、攻击6443端口:API Server未授权访问3、攻击10250端口:kubelet未授权访问 K8S集群架构解…

QT中使用QVTKOpenGLNativeWidget的简单教程以及案例

先添加一个带有ui的QT应用程序。 一、在ui界面中添加QVTKOpenGLNativeWidget控件 先拖出来一个QOpenGLWidget控件 修改布局如下: 然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件,步骤如下: 右击QOpenGLWidget窗口,选…

springboot配置swagger

springboot配置swagger Swagger 是什么Swagger配置springboot代码展示总结 Swagger 是什么 Swagger 是一个用于构建、文档和调用 RESTful Web 服务的强大工具。它提供了以下几方面的好处: 自动生成 API 文档: Swagger 可以自动生成 API 文档,包括接口的…

【Golang】grpc环境踩的坑

关于’protoc-gen-go’ 不是内部或外部命令 这个问题的出现是因为没有这个文件导致的 这个文件要通过我们下载的google.golang.org这个文件编译生成的 这里建议下载google提供的grpc包 protobuf的源码: git clone https://github.com/golang/protobuf 下载好之后进…

win11 定时计划任务

控制面板 任务计划 添加任务计划 ,选按步骤添加。

谷歌浏览器访问127.0.0.1时报错 Failed to read the ‘sessionStorage‘ property from ‘Window‘

谷歌浏览器访问 127.0.0.1 时报错如下: Uncaught DOMException: Failed to read the ‘sessionStorage’ property from ‘Window’: Access is denied for this document. 原因: 谷歌浏览器设置中禁止了 127.0.0.1 存储数据到浏览器设备上 解决方法…

NewStarCTF2023公开赛道-压缩包们

题目提示是压缩包 用010editor打开,不见PK头,补上50 4B 03 04 14 00 00 00 将文件改成.zip后缀,打开,解压出flag.zip 尝试解压,报错 发现一串base64编码 SSBsaWtlIHNpeC1kaWdpdCBudW1iZXJzIGJlY2F1c2UgdGhleSBhcmUgd…

metaRTC7集成lvgl ui demo编译指南

概要 开源轻量级嵌入式图形库lvgl:Light and Versatile Graphics Library,最低只需8kb内存,可为任何 MCU、MPU 和显示类型创建漂亮的 UI。 metaRTC新增lvgl demo,可在linux下编译运行。 源码下载 https://github.com/metartc/metaRTC/rel…