25. K 个一组翻转链表 --力扣 --JAVA

题目

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

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

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

解题思路

  1. 先排除特殊情况,k==1即不用翻转,节点为null则当前函数内也不需要翻转;
  2. 统计是否有k个数据来判断是否需要翻转;
  3. 通过while循环对k个节点进行翻转,尾节点传入下一次递归当中;
  4. 返回首节点,并赋值给上一个尾节点的next。

代码展示

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(k == 1){
            return head;
        }
        if(head == null){
            return null;
        }
        int index = 1;
        ListNode end = head.next;
        //判断是否需要继续翻转
        boolean status = false;
        while (end != null){
            index++;
            if(index == k){
                status = true;
                break;
            }
            //递归需要传递的数据
            end = end.next;
        }
        if(status){
            ListNode before = end.next;
            ListNode now = head;
            index = 0;
            while (index < k){
                ListNode temp = now.next;
                now.next = before;
                before = now;
                now = temp;
                index++;
            }
            head.next = reverseKGroup(head.next, k);
        } else {
            return head;
        }
        return end;
    }
}

你可能感兴趣的:(力扣练习,算法,数据结构)