letcode-K个一组翻转链表(栈思想 + 递归)

题目:输入一个有序链表,每K个一组进行反转。

  • 输入:1, 2, 3, 4, 5, 5, 6, 8, 10

  • K = 3

  • 输出:3, 2, 1, 5, 5, 4, 10, 8, 6

题解

反转,那么最先想到的应该是栈;但是,java.util包里的栈是不可能用的,反正只是简单的记录,那么我们建立一个
长度为:K 的数组就可以了。

  1. 每次递归,根据传入的头节点,K次线性访问并保存数组:
  2. 不足K次,说明不够一次反转,提前退出
  3. 读到K个后逆序读取数组,反转链表
  4. 第K + 1 个节点执行下一次递归。

不考虑递归消耗的内存,这里的空间复杂度应该是一个常数,即用来替代栈的数组。

CODE

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode[] nodeStack = new ListNode[k];
        return deepReverseKGroup(head, nodeStack, k);
    }
    /**
     * 每k个递归一次,数组模拟栈
     * */
    private ListNode deepReverseKGroup(ListNode head,ListNode[] nodeStack, int k){
        ListNode retNode = head,temp2;
        int nodeIndex = 0;
        while (head != null && nodeIndex < k){
            nodeStack[nodeIndex++] = head;
            head = head.next;
        }
        if (nodeIndex == k){
            for(int i = k - 1; i > 0; --i){
                nodeStack[i].next = nodeStack[i-1];
            }
            retNode = nodeStack[k -1];
            temp2 = nodeStack[0];
            temp2.next = deepReverseKGroup(head, nodeStack, k);
        }
        return retNode;
    }
}

posted @ 2021-11-25 10:22  bokerr  阅读(35)  评论(0编辑  收藏  举报