https://blog.csdn.net/ganggang129/article/details/103987491
文章目录
1. 题目描述
2. 解题方法及代码
2.1 递归法
3. LeetCode练习代码仓库(gitee)
1. 题目描述
LeetCodeCN链接
该题是No.24的一般化版本
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
2. 解题方法及代码
2.1 递归法
把链表按一组k个节点分组,反转每组的节点,每组反转后的最后一个节点(也就是反转前的第一个节点)连接下一组反转后的第一个节点。reverseKGroup函数的参数是原链表的表头,返回值是反转后新链表的表头。
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || head.next == null) return head;
ListNode[] nodes = new ListNode[k]; // k个指针分别表示组内的每个元素
if (largerThanK(head, k)) {
for(int i = 0; i < k; i++) {
nodes[i] = head;
head = head.next;
} // 将接下来的k个元素加入到数组,顺便此时head也移动到了下一组的开头
for (int i = 0; i < k - 1; i++) {
nodes[i+1].next = nodes[i];
} // 反转该组的k个节点
nodes[0].next = reverseKGroup(head, k); // 反转后的最后一个节点(也就是反转前的第一个节点)连接下一组节点反转后的开头
return nodes[k-1];
} else return head; // 如果剩余不到k个,就原封不动返回
}
public boolean largerThanK(ListNode head, int k) { //判断剩余的节点个数是否大于等于k个
if (k == 1 && head != null) return true;
boolean flag = true;
for (int i = 0; i < k - 1; i++) {
head = head.next;
if (head == null) {
flag = false;
break;
}
}
return flag;
}
}
3. LeetCode练习代码仓库(gitee)
我的LeetCode练习题