题目概述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例

image-20211009214548283

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

题解

  1. 循环遍历k遍,找到k个节点,先翻转这一部分
  2. 先翻转区间[m,n]之间的节点
  3. 分组在递归反转后面的节点

Coding

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || head.next == null){
return head;
}
ListNode l2 = head;
for(int i = 0;i < k;i++){
if(l2 == null){
return head;
}
l2 = l2.next;
}
ListNode l1 = reverse(head,l2);
head.next = reverseKGroup(l2,k);
return l1;
}
//反转[m,n)之间的节点
public ListNode reverse(ListNode m,ListNode n){
ListNode dumy = new ListNode(0);
ListNode cur = m;
while(cur != n){
ListNode next = cur.next;
cur.next = dumy.next;
dumy.next = cur;
cur = next;
}
return dumy.next;
}
}