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 已經有些忘記了。

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