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

力扣25题: K 个一组翻转链表

【题目链接】力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台,解题代码如下:

class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode curNode = head;ListNode groupHead, groupTail = head, lastGroupTail = null;int len = 0;while (curNode != null) {curNode = curNode.next;if (++len % k == 0) {groupHead = reverseGroup(groupTail, curNode);if (lastGroupTail != null) {lastGroupTail.next = groupHead;lastGroupTail = groupTail;} else {lastGroupTail = head;head = groupHead;}groupTail = curNode;}}lastGroupTail.next = groupTail;return head;}private ListNode reverseGroup(ListNode head, ListNode tail) {ListNode curNode = head, lastNode = null, nextNode;while (curNode != tail) {nextNode = curNode.next;curNode.next = lastNode;lastNode = curNode;curNode = nextNode;}return lastNode;}

【解题步骤】:

  1. 记录几个指针:curNode当前节点,用于依次遍历所有节点;lastGroupTail :上一K组的尾指针;groupHead:当前K组首指针,翻转之前是尾指针;groupTail:当前K组尾指针,翻转之前是首指针
    ListNode curNode = head;
    ListNode groupHead, groupTail = head, lastGroupTail = null;
  2. 依次遍历链表,每K个节点一组进行相应处理,对于当前K个节点来说,就是简单的链表翻转操作;
    curNode = curNode.next;
    if (++len % k == 0) {groupHead = ListNode.reverseList(groupTail, curNode);。。。
  3. 新翻转一个K组指针后,如果上一K组节点不为空:将上一K组的尾指针指向当前K组首指针,然后再将当前K组尾指针设置为上一K组的尾指针
    if (lastGroupTail != null) {lastGroupTail.next = groupHead;lastGroupTail = groupTail;
    } 
  4. 如果上一K组节点为空,说明处理的是第一组,那么翻转之后的链表首节点就是第一组的尾节点,上一K组尾指针设置为之前的链表首节点:
    else {lastGroupTail = head;head = groupHead;
    }
  5. 设置当前组的尾指针为当前节点
    groupTail = curNode;
  6. 重复2,3步操作,,直至遍历到链表结尾
  7. 最后收一下尾:将当前K组尾指针指向最后还未翻转的一组(不足K个节点)的首指针
    lastGroupTail.next = groupTail;

【思路总结】

1)首先要对复杂问题分解:再复杂的问题像“”庖丁解牛“”一样,找到其中脉络,进行分解之后,都会被切割成简单的个体小单元,很容易理解和掌握。

2)其次要学会“”依此类推“”的思路:算法的解决大数据的问题,基本都是找出其中规律,周而复始的进行重复性操作,直至结束:

3)最后处理一下开头、结尾或者空指针等特殊情况即可

http://www.lryc.cn/news/273870.html

相关文章:

  • 网络安全应急响应工具之-流量安全取证NetworkMiner
  • http 401 错误
  • Docker-Compose部署Redis(v7.2)哨兵模式
  • 解决问题:PPT中插入视频编辑模式可以播放,幻灯片放映后播放不了
  • 使用react+vite开发项目时候,部署上线后刷新页面无法访问解决办法
  • 45. 跳跃游戏 II(Java)
  • [足式机器人]Part4 南科大高等机器人控制课 CH12 Robotic Motion Control
  • 【C++】知识点汇总(上)
  • 解决docker容器内无法连接宿主redis
  • 43 tmpfs/devtmpfs 文件系统
  • C语言编译器(C语言编程软件)完全攻略(第十二部分:VS2010下载地址和安装教程(图解))
  • 【VRTK】【VR开发】【Unity】18-VRTK与Unity UI控制的融合使用
  • BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【3】
  • 静态网页设计——校园官网(HTML+CSS+JavaScript)
  • phpstudy_pro 关于多版本php的问题
  • TemporalKit的纯手动安装
  • 人生重开模拟器
  • 优化算法3D可视化
  • 魔术表演Scratch-第14届蓝桥杯Scratch省赛真题第1题
  • LLM 中的长文本问题
  • 深入了解Swagger注解:@ApiModel和@ApiModelProperty实用指南
  • Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求
  • 数据库索引简析
  • leetcode贪心(单调递增的数字、监控二叉树)
  • 如何在win7同样支持Webview2 在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime
  • 【docker】网络模式管理
  • LiveGBS国标GB/T28181流媒体平台功能-国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话
  • 技术发展驱动编程语言走向
  • tp5+workman(GatewayWorker) 安装及使用
  • vscode安装Prettier插件,对vue3项目进行格式化