首页 > 其他分享 >链表中的节点每k个一组翻转

链表中的节点每k个一组翻转

时间:2023-04-08 14:44:06浏览次数:41  
标签:ListNode next 链表 tail prev 节点 翻转

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0); // 定义虚拟节点
        dummy.next = head;
        ListNode prev = dummy; // 定义一个前置节点prev,用于保存已经翻转完成的部分的尾部节点

        while (head != null) { // 遍历整个链表
            ListNode tail = prev;
            for (int i = 0; i < k; i++) { // 找到需要翻转的一组k个节点的头和尾
                tail = tail.next;
                if (tail == null) {
                    return dummy.next; // 如果剩余节点数不足一组k个节点,则直接返回结果
                }
            }
            ListNode next = tail.next; // 保存下一组k个节点的头节点
            ListNode[] reversed = reverse(head, tail); // 翻转当前组k个节点
            head = reversed[0]; // 更新翻转后的头节点
            tail = reversed[1]; // 更新翻转后的尾节点
            prev.next = head; // 将翻转后的一组k个节点连接到已经翻转完成的部分的尾部
            tail.next = next; // 将翻转后的一组k个节点连接到下一组k个节点的头部
            prev = tail; // 更新前置节点prev
            head = tail.next; // 更新头节点
        }

        return dummy.next; // 返回结果
    }

    private ListNode[] reverse(ListNode head, ListNode tail) {
        ListNode prev = tail.next; // 定义一个前置节点prev,用于保存已经翻转完成的部分的尾部节点
        ListNode curr = head; // 定义一个当前节点curr,用于保存当前遍历到的节点
        while (prev != tail) { // 翻转当前一组k个节点
            ListNode next = curr.next; // 保存下一个节点
            curr.next = prev; // 将当前节点的next指针指向前置节点
            prev = curr; // 更新前置节点prev
            curr = next; // 更新当前节点curr
        }
        return new ListNode[]{tail, head}; // 返回翻转后的头节点和尾节点
    }
}

标签:ListNode,next,链表,tail,prev,节点,翻转
From: https://www.cnblogs.com/zhaozihang/p/17298532.html

相关文章

  • 带头节点的单链表的思路及代码实现
    带头节点的单链表的思路及代码实现(JAVA)一、什么是的单链表①标准定义单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象)+指针(指示后继元素存储位置,元素就是存储数据的存储单......
  • 节点加入到单链表时按需求排序
    JAVA实现节点加入到单链表时按需求排序回顾在上文《带头节点的单链表的思路及代码实现(JAVA)》中我们想要去实现让数据节点不考虑加入顺序实现数据节点排序效果。那么我们要如何实现这一需求呢?一、实现思路①理论思路假设我们要根据数据节点的ID进行排序,那么我们可以通过使用......
  • JAVA实现单链表修改和删除数据节点
    JAVA实现单链表修改和删除数据节点一、修改单链表中的一个节点①实现思路因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表。所以我们需要先找一个辅助节点temp来进行节点代理操作。通过遍历链表,使辅助节点temp后移,找到要修改的节点......
  • 链表linklist
       LinkList.hLinkList.cLinkList.h#pragmaonce#include<stdbool.h>typedefintData;//定义节点结构typedefstructlinkNode{Datadata;structlinkNode*next;}linkNode;//创建链表linkNode*createList();//创建节点linkNode*create......
  • Redis 源码解析之通用双向链表(adlist)
    Redis源码解析之通用双向链表(adlist)概述Redis源码中广泛使用adlist(Agenericdoublylinkedlist),作为一种通用的双向链表,用于简单的数据集合操作。adlist提供了基本的增删改查能力,并支持用户自定义深拷贝、释放和匹配操作来维护数据集合中的泛化数据value。adlist的数......
  • 链表的回文判断—Java实现
    对于这个题,主要是老是局限于方法内的变量,未想到借助外部变量辅助:具如下,不可用数除法,会溢出异常:即使是取最大的long也会溢出,常规方法不再赘述,具体以代码如下:1packageProblemSolve;23publicclassSolution5{4privateListNodefrontNode;5publicboolean......
  • k8s节点变配pod驱逐操作
    说明:日常运维中或多或少遇到k8s节点调整配置,或者k8s集群中某节点有问题,需要下架操作。以k8s集群中节点172.24.80.2节点需要扩容为例,共三步:#暂停节点172.24.80.2调度,使节点172.24.80.2不可用,使节点不接收新的podkubectlcordon172.24.80.2#驱逐节点上运行的pod到其他节点,kube......
  • 动力节点王鹤SpringBoot3笔记——第四章 访问数据库
    视频:动力节点SpringBoot3从入门到项目实战第四章访问数据库SpringBoot框架为SQL数据库提供了广泛的支持,既有用JdbcTemplate直接访问JDBC,同时支持“objectrelationalmapping”技术(如Hibernate,MyBatis)。SpringData独立的项目提供对多种关系型和非关系型数据库的访问支持。......
  • 动力节点王鹤SpringBoot3笔记—— 第二章 掌控SpringBoot基础篇
    第二章掌控SpringBoot基础篇2.1SpringBoot?SpringBoot是目前流行的微服务框架倡导约定优先于配置”其设目的是用来简化新Spring应用的初始化搭建以及开发过程。SpringBoot提供了很多核心的功能,比如自动化配置starter(启动器)简化Maven配置、内嵌Servlet容......
  • 动力节点王鹤SpringBoot3笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......