鏈表中的節點每k個一組翻轉


題目

將給出的鏈表中的節點每 k 個一組翻轉,返回翻轉后的鏈表
如果鏈表中的節點數不是 k 的倍數,將最后剩下的節點保持原樣
你不能更改節點中的值,只能更改節點本身。
要求空間復雜度 O(1)
例如:
給定的鏈表是1→2→3→4→5
對於 k=2, 你應該返回 2→1→4→3→5
對於 k=3, 你應該返回 3→2→1→4→5

題目分析

這里我借用一個大神化的過程圖,寫的真好看
image

思路:先計算鏈表長度根據k計算需要翻轉幾輪,每一輪就采取頭插法實現翻轉

代碼(有注釋):

 public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        if(head==null||head.next==null||k<2){
            return head;
        }
        //構造一個新的頭節點,方便返回值時找到反轉后鏈表的頭節點。
        ListNode res = new ListNode(0);
        res.next = head;
        
        //定義三個指針
        ListNode pre = res,cur=head,tmp=null;
        
        //鏈表長度
        int length = 0;
        while(head!=null){
            length++;
            head = head.next;
        }
        
        //循環幾次,每次k個,這里也是采用頭插法的方式
         //pre作為每一小段鏈表的頭節點,負責銜接
        for(int i = 0;i<length/k;i++){
            for(int j=1;j<k;j++){
                tmp = cur.next;
                cur.next = tmp.next;
                tmp.next = pre.next;
                pre.next = tmp;
            }
            //每個子序列反序完成后,pre,cur需要更新至下一子序列的頭部
            pre = cur;
            cur = cur.next;
        }
        return res.next;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM