链表:K 个一组翻转链表

56 阅读1分钟

leetcode:25. K 个一组翻转链表

题目描述

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k **的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例

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

解题思路

  1. [0, k - 1]子链表进行翻转。

image.png

  1. 后续递归处理。

完整代码:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (length(head) < k) return head;

        ListNode dummy = new ListNode(-1), p = head;
        for (int i = 0; i < k; i++) {
            ListNode next = p.next;
            p.next = dummy.next;
            dummy.next = p;
            p = next;
        }
        head.next = reverseKGroup(p, k);

        return dummy.next;
    }

    int length(ListNode head) {
        int len = 0;
        while (null != head) {
            len++;
            head = head.next;
        }
        return len;
    }
}