Leetcode 25. K 個一組翻轉連結串列 C++
阿新 • • 發佈:2021-02-15
題目:
給你一個連結串列,每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; } };