字节:从尾部K个节点反转链表

题目

一个链表0,1,2,3,4,5,6,7,从链表尾部 K个节点翻转,求翻转后的链表。
比如:[0,1,2,3,4,5,6,7] k=3 翻转后 [0,1,4,3,2,7,6,5]。
空间复杂度O(1)。

解法

/*** 链表 14,13,12,11,10,9,8,7,6,5,4,3,2,1* 从尾部节点1开始倒着K个一组翻转* 结果 14,13, 10,11,12, 7,8,9, 4,5,6, 1,2,3  请写出Java解法 要求O(1)* @param head* @param k* @return*/public static ListNode reverseKGroupFromTail(ListNode head, int k) {//                      初始化链表 =>14,13,12,11,10,9,8,7,6,5,4,3,2,1//第一步 整体反转  参考 力扣 反转链表1 =>1,2,3,4,5,6,7,8,9,10,11,12,13,14//第二步 部分反转  参考 力扣 反转链表2 =>3,2,1,6,5,4,9,8,7,12,11,10,13,14//第三步 整体反转  参考 力扣 反转链表1 =>14,13 10,11,12,7,8,9,4,5,6,1,2,3int[] count = new int[1];ListNode newHead = reverseList(head,count);int len = count[0];int groups = len / 4;int left = 1;int right = k;//中间处理ListNode processingHeadLs = newHead;for (int i = 0; i <= groups; i++) {processingHeadLs = reverseBetween(processingHeadLs,left,right);left = left + k;right = right + k;}ListNode finalHead = reverseList(processingHeadLs);return finalHead;}/*** https://leetcode.cn/problems/reverse-linked-list-ii/* 反转指定区间的链表* @param head 链表头节点* @param left 指定区间的起始位置* @param right 指定区间的结束位置* @return 反转区间后的链表头节点*/
public static ListNode reverseBetween(ListNode head, int left, int right) {// 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论ListNode dummyNode = new ListNode(-1);dummyNode.next = head;//pre = dummyNode 便于操作preListNode pre = dummyNode;// 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点// 建议写在 for 循环里,语义清晰for (int i = 0; i < left - 1; i++) {pre = pre.next;}// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点ListNode rightNode = pre;for (int i = 0; i < right - left + 1; i++) {rightNode = rightNode.next;}// 第 3 步:切断出一个子链表(截取链表)ListNode leftNode = pre.next;ListNode curr = rightNode.next;// 注意:切断链接pre.next = null;rightNode.next = null;// 第 4 步:同第 206 题,反转链表的子区间reverseList(leftNode);// 第 5 步:接回到原来的链表中pre.next = rightNode;leftNode.next = curr;return dummyNode.next;
}/*** 反转链表* @param head 链表头节点* @return prev 反转后的链表头节点*/
private static ListNode reverseList(ListNode head) {ListNode prev = null;ListNode current = head;while (current !=null) {ListNode nextTemp = current.next;current.next = prev;prev = current;current = nextTemp;}return prev;
}/*** 反转链表* @param head 链表头节点* @param count 用于记录链表节点数的数组* @return prev 反转后的链表头节点*/
private static ListNode reverseList(ListNode head,int[] count) {ListNode prev = null;ListNode current = head;while (current !=null) {ListNode nextTemp = current.next;current.next = prev;prev = current;current = nextTemp;count[0]++;}return prev;
}

验证

System.out.println("开始");
ListNode newNode2 = ListNode.getListNode(14,13,12,11,10,9,8,7,6,5,4,3,2,1);
newNode2.toString();
ListNode newNode_k_3_tail = reverseKGroupFromTail(newNode2,3);
newNode_k_3_tail.toString();
System.out.println("结束");

在这里插入图片描述

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

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

相关文章

Kotlin 协程:深入理解 ‘async { }‘

Kotlin 协程&#xff1a;深入理解 ‘async { }’ Kotlin 协程是一种强大的异步编程工具&#xff0c;它提供了一种简洁、易读的方式来处理并发和异步操作。在 Kotlin 协程库中&#xff0c;async {} 是一个关键的函数&#xff0c;它允许我们启动一个新的协程&#xff0c;并返回一…

python爬虫概念及介绍

1. 什么是互联网爬虫&#xff1f; 解释 1 &#xff1a;通过一个程序&#xff0c;根据 Url ( http : // www . taobao . com ) 进行爬取网页&#xff0c;获取有用信息 解释 2&#xff1a;使用程序模拟浏览器&#xff0c;去向服务器发送请求&#xff0c;获取响应信息 2. 爬虫核…

自动驾驶传感器之 摄像头传统视觉技术

1.前言 相 信 很 多 通 过 之 前 摄 像 头 的 基 础 知 识 讲 解 &#xff0c; 已 经 对 车 载 摄 像 头 有 一 定 的 了 解 &#xff0c; 摄 像头 两 大 主 要 功 能 是 定 位 和 感 知 &#xff0c; 我 们 通 过 不 同 的 软 硬 件 来 实 现 前 向 碰 撞 预 警 、 行 人 探 …

制造业实施QMS质量管理系统的作用是什么?

QMS质量管理系统是一个关键的组织管理工具&#xff0c;用于确保产品和服务的质量符合预期标准&#xff1b;通过有效地实施万界星空科技QMS&#xff0c;组织可以确保产品和服务的质量符合预期标准&#xff0c;提升客户满意度&#xff0c;增强市场竞争力。 一、QMS系统的特点&…

大洋钻探系列之七中国大洋钻探船梦想号

中国大洋钻探梦想号2021年11月30日开工建造&#xff0c;2023年12月27日在珠江口海域完成首航&#xff0c;预计2024年正式交付使用&#xff0c;从而实现了2011年中国IODP专家咨询委员会提出的我国大洋钻探发展“三步走”战略的第三步建造中国的大洋钻探船。 恰逢IODP新旧计划交替…

tsmc12:宽金属的spacing 规则(M8.S.3)

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 DRC如下图: 意思是说&#xff0c;当M8宽度大于4.05且平行长度大于4.05的时候间距要求 大于等于1.35&#xff0c;这里可以把一根宽金属拆成两根宽度是4的窄金属。&#xff0c;效果如下图:

循环——枚举算法2(c++)

目录 找和为K的两个元素 描述 在一个长度为n(n < 1000)的整数序列中&#xff0c;判断是否存在某两个元素之和为k。 输入 第一行输入序列的长度n和k&#xff0c;用空格分开。 第二行输入序列中的n个整数&#xff0c;用空格分开。 输出 如果存在某两个元素的和为k&…

Linux文本三剑客-awk

一、awk的介绍&#xff1a; 1.awk的简介&#xff1a; AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具 可以在无交互的模式下实现复杂的文本操作 相较于sed常作用于一整个行的处理&#xff0c;awk则比较倾向于一行当中分成数个字段来处理&#xff0c;因…

11张宝藏GIS开发思维导图,重点清晰,建议带走!

在GIS开发过程中&#xff0c;涉及大量的数据、地图、工具和技术。通过思维导图&#xff0c;我们可以将这些复杂的元素进行可视化&#xff0c;更好地理解和整理思路&#xff0c;提高开发效率。 同时思维导图利用了色彩、线条、关键词、图像等元素&#xff0c;可以加强记忆的可能…

《A++ 敏捷开发》- 6 估算软件规模

为什么要估规模 规模可以帮我们&#xff1a; 依据历史数据策划&#xff0c;例如估算工作量、工期。归一(Normalize)不同项目作比较。知道现在水平。 依据历史数据策划先把项目分成组件&#xff0c;参考以往类似的组件所花工作量&#xff0c;估算整个项目的总工作量。规模大小…

探索智慧文旅:科技如何提升游客体验

随着科技的迅猛发展&#xff0c;智慧文旅已成为旅游业的重要发展方向。通过运用先进的信息技术&#xff0c;智慧文旅不仅改变了传统旅游业的运营模式&#xff0c;更在提升游客体验方面取得了显著成效。本文将深入探讨科技如何助力智慧文旅提升游客体验。 一、智慧文旅的兴起与…

电池供电型 微功耗测控终端

一、产品介绍 旭华智能 SV-RT4280型微功耗遥测终端&#xff0c;是一款集数据采集、存储、无线传输等功能于一体的智能终端&#xff0c;微功耗设计并内置大容量电池&#xff0c;整机IP68防护&#xff0c;并具有防爆、防腐等特点&#xff0c;适用于没有外在电源供电&#xff0c…