热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

个人记录LeetCode25.ReverseNodesinkGroup

问题:Givenalinkedlist,reversethenodesofalinkedlistkatatimeandreturnitsmodifiedlist.I

问题:
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

问题要求:给定一个链表,以及指定的逆序长度k。
链表中每连续k个节点,都需要进行逆序;
若连续节点的长度小于k个,则不做逆序操作。
这里要求使用内存必须是常量级别。

思路:

对于连续的K个节点,我们定义prev、begin、end和nextBegin这几个指针。
如图所示,含义还是很清晰的,不作赘述。

在开始时,将prev的next变为end。
然后,定义一个move指针,从begin开始移动到end的前一个节点。
于是end的next指向move。

end前移到move的位置。
move又从begin开始,移动到end的前一个节点。
再次进行与上面一样的修改。

直到,end移动到begin的后面。
此时,将end的next修改为begin。
begin的next修改为nextBegin,begin将作为后续连续K个节点的Prev。

以上方法并不是最快的,但占用的内存是常数级的(只用到了引用),满足要求。
当然,实际上我这里从最后开始逆着修改next,比较耗时。

从前往后修改也是可以的,只用一个引用保存下一个要修改的节点即可。

代码示例:
1、逆着修改next

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
public class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head &#61;&#61; null || k <&#61; 1) {return head;}ListNode temp &#61; head;int len &#61; 0;//先判断长度够不够while (temp !&#61; null) {&#43;&#43;len;if (len &#61;&#61; k) {break;}temp &#61; temp.next;}if (len !&#61; k) {return head;}//初始时prev为nullListNode prev &#61; null;ListNode begin &#61; head;//长度够的话&#xff0c;最终的头为此时的第K个节点head &#61; temp;while (begin !&#61; null) {//每次操作前&#xff0c;记录当前的begin&#xff0c;这是下一次的prevListNode lastBegin &#61; begin;begin &#61; reverseKGroupInternal(prev, begin, k);prev &#61; lastBegin;}return head;}private ListNode reverseKGroupInternal(ListNode prev, ListNode begin, int k) {ListNode temp &#61; begin;ListNode end &#61; null;ListNode nextBegin &#61; null;int len &#61; 0;//同样需要判断此次操作的长度是否满足条件while (temp !&#61; null) {&#43;&#43;len;if (len &#61;&#61; k) {//得到本次操作的end及nextBeginend &#61; temp;nextBegin &#61; end.next;break;}temp &#61; temp.next;}if (len !&#61; k || end &#61;&#61; null) {return null;}//prev的next指向endif (prev !&#61; null) {prev.next &#61; end;}ListNode move;while (begin.next !&#61; end) {//移动move到end的前面move &#61; begin;while (move.next !&#61; end) {move &#61; move.next;}//end的next指向moveend.next &#61; move;//前移endend &#61; move;}//最后时刻&#xff0c;end刚好在begin后面//修改end.next指向beginend.next &#61; begin;//begin.next指向nextBeginbegin.next &#61; nextBegin;return nextBegin;}
}

2、基本逻辑与上面一致&#xff0c;就是顺着改next

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val &#61; x; }* }*/
public class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head &#61;&#61; null || k <&#61; 1) {return head;}ListNode temp &#61; head;int len &#61; 0;while (temp !&#61; null) {&#43;&#43;len;if (len &#61;&#61; k) {break;}temp &#61; temp.next;}if (len !&#61; k) {return head;}ListNode prev &#61; null;ListNode begin &#61; head;head &#61; temp;while (begin !&#61; null) {ListNode lastBegin &#61; begin;begin &#61; reverseKGroupInternal(prev, begin, k);prev &#61; lastBegin;}return head;}private ListNode reverseKGroupInternal(ListNode prev, ListNode begin, int k) {ListNode temp &#61; begin;ListNode end &#61; null;ListNode nextBegin &#61; null;int len &#61; 0;while (temp !&#61; null) {&#43;&#43;len;if (len &#61;&#61; k) {end &#61; temp;nextBegin &#61; end.next;break;}temp &#61; temp.next;}if (len !&#61; k || end &#61;&#61; null) {return null;}if (prev !&#61; null) {prev.next &#61; end;}ListNode first &#61; begin;ListNode second &#61; begin.next;begin.next &#61; nextBegin;//只有下面这部分存在差异while(second !&#61; null && second !&#61; end) {ListNode local &#61; second.next;second.next &#61; first;first &#61; second;second &#61; local;}if (second !&#61; null) {second.next &#61; first;}return nextBegin;}
}

在前文的基础上&#xff0c;可以进一步优化每一段逆转的逻辑&#xff0c;即每一段轮询的同时完成逆转&#xff1a;

class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head &#61;&#61; null || k <&#61; 1) {return head;}ListNode ret &#61; head;ListNode pre &#61; null;ListNode nextBegin;ListNode begin &#61; head;ListNode end &#61; begin;while (begin !&#61; null) {int count &#61; 1;while(count }


推荐阅读
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 本文介绍了一种使用链剖分(Link-Cut Tree, LCT)来维护动态树结构的方法,特别是如何通过 LCT 来高效地管理子树的信息,如子树大小等。 ... [详细]
  • 本文详细探讨了select和epoll两种I/O多路复用技术的内部实现原理,分析了它们在处理大量文件描述符时的性能差异,并通过具体示例代码展示了select的工作流程。 ... [详细]
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 题目概述:Sereja 拥有一个由 n 个整数组成的数组 a1, a2, ..., an。他计划执行 m 项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
author-avatar
华华eva3
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有