25. Reverse Nodes in k-Group

25. Reverse Nodes in k-Group

题目

给出一个链表,每次翻转链表的K个结点,返回修改后的链表。
k是正整数,并且小于等于链表长度。如果结点的数目不是k的倍数,最后剩下的不到K个结点保持原样。
比如:

给出链表: 1->2->3->4->5

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

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

注意:
空间复杂度为O(1)

代码块

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(head == null || head.next == null) return head;
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        ListNode pre = dummyNode;
        ListNode left = head;
        ListNode right = head.next;
        ListNode checkNode = head;
        while(true){
            for(int i = 0; i < k; i++){
                if(checkNode == null){
                    return dummyNode.next;
                }
                checkNode = checkNode.next;
            }
            for(int i = 0; i < k - 1; i++){
                left.next = right.next;
                //right.next = left;
                right.next = pre.next;//正确
                pre.next = right;
                //right = right.next;
                right = left.next;//正确
            }
            pre = left;
            left = right;
            if(right == null){
                return dummyNode.next;
            }else{
                right = right.next;
            }
        }
    }
}

代码分析

本题是几道题目的结合,reverse linked listII 和swap in pairs. 套用了swap 的循环方法(while)以及使用反转链表作为循环体。
1. 涉及到head的变化,所以要用dummyNode。
2. 还需要用checkNode来检查是不是满足k的倍数。
3. 最后使用了三个结点pre,left , right来进行变换。
注意要搞清楚怎么变化的,谁指向谁,还是需要背加理解。reverse 已经有些忘记了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章