1. 程式人生 > 其它 >Leetcode 25. K 個一組翻轉連結串列 C++

Leetcode 25. K 個一組翻轉連結串列 C++

技術標籤:刷題leetcode連結串列資料結構

題目:

給你一個連結串列,每k個節點一組進行翻轉,請你返回翻轉後的連結串列。

k是一個正整數,它的值小於或等於連結串列的長度。

如果節點總數不是k的整數倍,那麼請將最後剩餘的節點保持原有順序。

示例:

給你這個連結串列:1->2->3->4->5

當k= 2 時,應當返回: 2->1->4->3->5

當k= 3 時,應當返回: 3->2->1->4->5

說明:

你的演算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

Solution:

先看下剩餘子串是否滿足 k 的 長度,不滿足直接 return ,否則反轉子串;連結串列題推薦在紙上畫出來

同一個程式碼提交三次執行效率都不同越來越慢,不知道為何?

Code:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(k == 1) return head;
        ListNode* hair = new ListNode(0);
        hair->next = head;
        ListNode* pre = hair;
        while (head) {
            ListNode* tail = pre;
            // 檢視剩餘部分長度是否大於等於 k
            for (int i = 0; i < k; ++i) {
                tail = tail->next;
                if (!tail) {
                    return hair->next;
                }
            }
            ListNode* nex = tail->next;
            //反轉子串 head---tail
            ListNode* cur = head->next;
            ListNode* ppre = head;
            tail = head;
            for(int i = 1; i < k; ++i){
                head = cur;
                cur = cur->next;
                head->next = ppre;
                ppre = head;
            }
            // 把子連結串列重新接回原連結串列
            pre->next = head;
            tail->next = nex;
            pre = tail;
            head = tail->next;
        }
        return hair->next;
    }
};