题目:
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表。
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样。
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000,1≤k≤2000,链表中每个元素都满足 0≤val≤10000。
要求空间复杂度 O(1),时间复杂度 O(n)。
例如:
给定的链表是 1→2→3→4→5
对于 k=2 , 你应该返回 2→1→4→3→5
对于 k=3, 你应该返回 3→2→1→4→5
示例1
输入:{1,2,3,4,5},2
返回值:{2,1,4,3,5}
示例2
输入:{},1
返回值:{}
思路:递归
需要明确:
- 递归结束的点(当剩下的元素不满足k个);
- 每一级递归的任务(每个小组内k个节点进行翻转(用第一题的解法),翻转后的小链表的尾节点连接下一个翻转后的小链表节点的头节点);
- 返回值。
代码:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
ListNode tail = head;
//1.递归结束的点,当每一小组节点数目<k时,直接返回
for(int i = 0; i < k; i++) {
if(tail == null) {
return head;
}
tail = tail.next;
}
ListNode pre = null;
ListNode cur = head;
//2.每一级的任务
while(cur != tail) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
head.next = reverseKGroup(tail,k);
//3.找到返回值
return pre;
}
}