25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
这题直接就放弃了,看了官方的答案,感觉也不是特别简洁,评论区的一个答案到是深得我心。这种题还得是递归。
https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/248591/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/?envType=study-plan-v2&envId=top-100-liked
官方解法评论区昵称为 Jack Liang 的用户 的解法
就是要把一个链表分成k个为一组的,每一组自己处理好翻转,然后把本组翻转好的新的头结点指向后续翻转的结果。
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null) return head;
ListNode p = head;
int i = 1;
// p指向本组要翻转链表的尾结点
while (p != null && p.next != null && i < k) {
p = p.next;
i++;
}
if (i < k) return head;
// 本组结点翻转
ListNode h = head;
ListNode pre = null;
ListNode next = p.next;
while (h != next) {
ListNode t = h.next;
h.next = pre;
pre = h;
h = t;
}
//本组翻转完成后的新的头结点指向后续翻转的结果
head.next = reverseKGroup(next, k);
return p;
}
}