leetcode 25. K 個一組翻轉(zhuǎn)鏈表

題目描述

給你一個鏈表,每 k 個節(jié)點一組進行翻轉(zhuǎn),請你返回翻轉(zhuǎn)后的鏈表。
k 是一個正整數(shù),它的值小于或等于鏈表的長度。
如果節(jié)點總數(shù)不是 k 的整數(shù)倍,那么請將最后剩余的節(jié)點保持原有順序。
相關(guān)話題:?鏈表 ???難度:?困難

示例 :
給定這個鏈表:1->2->3->4->5
當 k = 2 時,應(yīng)當返回: 2->1->4->3->5
當 k = 3 時,應(yīng)當返回: 3->2->1->4->5

說明 :

  • 你的算法只能使用常數(shù)的額外空間。
  • 你不能只是單純的改變節(jié)點內(nèi)部的值,而是需要實際的進行節(jié)點交換。

思路:
思路很簡單,基本方法和反轉(zhuǎn)鏈表 II一樣。
主要是確定邊界,因為有可能最后剩余的節(jié)點不足k個。

  • 定義兩個指針pq,pq開始都指向子區(qū)間的開頭節(jié)點的前驅(qū)
  • 先讓qk步,如果走完k步,q != null則表示夠k個,否則不夠,直接結(jié)束
  • 反轉(zhuǎn)完一個子區(qū)間的節(jié)點,更新pq的指向
/**
 * 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) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        head = dummy;
        ListNode p = head, q = p;
        ListNode cur = null;
        while(q != null){
            //讓q先跑k步,判斷區(qū)間內(nèi)節(jié)點是否夠k個
            for(int i = 0;i < k && q != null;i++){
                q = q.next;
            }
            //不夠k個,直接跳出
            if(q == null) break;
            //否則反轉(zhuǎn)子區(qū)間內(nèi)的節(jié)點
            cur = p.next;
            for(int i = 1;i < k;i++){
                ListNode x = cur.next;
                cur.next = x.next;
                x.next = p.next;
                p.next = x;   
            }
            //開始下一個區(qū)間
            p = cur;
            q = p;
        }
        return head.next;
    } 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容