Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

    • 206.反转链表
    • 148.排序链表(归并、快排)
    • 25.K个一组翻转链表
    • 21.合并两个有序链表
    • 141.环形链表
    • 160.相交链表
    • 92.反转链表Ⅱ
    • 142.环形链表Ⅱ
    • 23.合并k个升序链表
    • 138.复制带随机指针的链表
    • 234. 回文链表
    • 1171. 从链表中删去总和值为零的连续节点
    • 剑指offer22
    • 剑指 Offer 35. 复杂链表的复制
  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 链表
phan
2023-05-16

25.K个一组翻转链表

# 25.K个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]

  1. 第一步要先遍历一轮链表,找到最后一个不够k个节点的组的首节点,做法是设置一个计数器,每加到k就换一次首节点。这里注意遍历时候每次只能后移一个结点,跨两个在某些情况下容易出错。
  2. 第二步进行分组的反转,原理跟先前链表原地逆置差不多,只不过多了个分组,要把逆置后的组的尾节点设置为新的头结点(头插法),并且链接下一个组的头结点。phead是每个组的头结点,pend是每个组的尾结点。
public ListNode reverseKGroup(ListNode head, int k) {
            ListNode p=head,rhead=null;
            int group=1;
            while(p!=null)
            {
                if(group==k)
                {
                    rhead=p.next;
                    group=1;
                    p=p.next;
                    continue;
                }
                group++;
                p=p.next;
            }
            ListNode phead=new ListNode(0,head),res=phead;
            p=head;
            group=0;
            ListNode pnext,pend=null;
            while(p!=rhead)
            {
                if(group==k)
                {
                    phead=pend;
                    pend.next=p;
                    group=0;
                }
                pnext=p.next;

                if(group==0)
                {p.next=null;
                 pend=p;
                }
                else
                p.next=phead.next;

                phead.next=p;
                p=pnext;
                group++;
            }
            pend.next=rhead;
            return res.next;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
编辑 (opens new window)
#Leetcode#链表
上次更新: 2023/12/15, 15:49:57
148.排序链表(归并、快排)
21.合并两个有序链表

← 148.排序链表(归并、快排) 21.合并两个有序链表→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式