leetcode 25题 K 个一组翻转链表 Java解法

算法题目描述:

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

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

解题算法:

算法的总体思路是,将链表按照k个一组放入固定数组内,对数组内的元素进行翻转,依次类推。代码如下所示:

public ListNode reverseKGroup(ListNode head, int k) {
        if(k < 2){
            return head;
        }

        //常量额外存储空间 用来存储k个节点
        ListNode[] listNodes = new ListNode[k];
        ListNode guardNode = new ListNode(0);
        guardNode.next = head;
        ListNode preNode = guardNode;
        while (head != null && head.next != null) {
            ListNode tempNode = null;

            //链表k个一组放入数组中
            for (int i=0; i                 listNodes[i] = head;
                if(i == 0){
                    tempNode = head;
                }
                head = head.next;
            }

            //对数组进行翻转操作,同事注意要将上一组最后一个节点的next执行这组的第一个元素
            if(listNodes[k-1] != null) {
                listNodes[0].next = listNodes[k-1].next;
                for (int i=k-1; i>0; i--) {
                    listNodes[i].next = listNodes[i-1];
                }
                preNode.next = listNodes[k-1];
                preNode = tempNode;
                listNodes[k-1] = null;
            }
        }
        return guardNode.next;
    }

你可能感兴趣的:(数据结构与算法)