25. K 个一组翻转链表

image.png
image.png

递归

辅助函数 reverse 用于翻转 [head, tail),返回翻转后的头节点
总体思路:
1、找到待翻转的前 k 个节点,如果链表长度小于 k 则无需翻转
2、将其翻转,注意是左闭右开的,这里用到了辅助函数 reverse
3、对下一轮 k 个节点也进行翻转操作
4、将上一轮翻转后的尾节点指向下一轮翻转后的头节点

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:38.6 MB, 在所有 Java 提交中击败了70.72%的用户

  1. public class Solution {
  2. public ListNode reverseKGroup(ListNode head, int k) {
  3. if (head == null || head.next == null) {
  4. return head;
  5. }
  6. ListNode tail = head;
  7. for (int i = 0; i < k; i++) {
  8. // 如果长度小于 k 则不需要翻转
  9. if (tail == null) {
  10. return head;
  11. }
  12. tail = tail.next;
  13. }
  14. // 翻转 [head, tail),返回翻转后的头节点
  15. ListNode newHead = reverse(head, tail);
  16. // 将本轮翻转的尾节点指向下一轮翻转的头节点,递归调用
  17. head.next = reverseKGroup(tail, k);
  18. return newHead;
  19. }
  20. // 左闭右开区间的翻转
  21. public ListNode reverse(ListNode head, ListNode tail) {
  22. ListNode pre = null;
  23. ListNode next = null;
  24. while (head != tail) {
  25. next = head.next;
  26. head.next = pre;
  27. pre = head;
  28. head = next;
  29. }
  30. return pre;
  31. }
  32. }