連結串列中的節點每k個一組翻轉

chenchenshi73發表於2020-09-26

連結串列中的節點每k個一組翻轉

題目描述

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

程式碼

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode類 
     * @param k int整型 
     * @return ListNode類
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        if(head == null||head.next == null||k == 1) return head;//笨死了我,居然寫成 head.next != null,找了下面程式半天錯誤,哭
        
        
        //上一鏈條最後一個節點
        ListNode pre_tail = null;
        //當前鏈的頭節點
        ListNode cur_head = head;
        //當點鏈的尾結點
        ListNode cur_tail = head;
        
        int count = k-1;
        while(cur_tail!=null){
            //獲取當前鏈的尾結點
            if( count!=0 ){
                cur_tail = cur_tail.next;
                count--;
            }
            if(count == 0 && cur_tail!=null){
                //反轉當前連結串列
                reverseK(cur_head, cur_tail);
                //連線當前鏈和上一條鏈
                if(pre_tail==null){
                    head = cur_tail;
                }else{
                    pre_tail.next = cur_tail;
                }
                //下一輪轉換
                pre_tail = cur_head;
                cur_head = pre_tail.next;
                cur_tail = cur_head;
                count = k-1;
            }
            //count不為零且cur_tail=null,直接退出,k餘數後的節點不做操作
        }
        return head;
    }
    
    public void reverseK(ListNode cur_head, ListNode cur_tail){
        //為了獲取下一鏈條的開始節點
        ListNode head_next = cur_head;
        //前後節點
        ListNode p1 = cur_head;
        ListNode p2 = cur_head.next;
        //
        ListNode next_head = cur_tail.next;
        
        while( p2!=next_head && p2!=null ){
            head_next.next = p2.next;
            p2.next = p1;
            p1 = p2;
            //下一輪
            p2 = head_next.next;
        }
    }
}

相關文章