【LeetCode】25. k個一組翻轉連結串列 結題報告 (C++)
阿新 • • 發佈:2019-02-13
題目描述:
給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。
k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。
示例 :
給定這個連結串列:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
說明 :
- 你的演算法只能使用常數的額外空間。
- 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
解題方法:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode* pre; ListNode* p = head; ListNode* q = head; if(!p || k == 1) return p; for(int i = 1; i < k; i ++){ if(!q->next) return head; q = q->next; } pre = p; head = q; while(p->next != head){ q = p->next; p->next = p->next->next; q->next = pre; pre = q; } p->next = reverseKGroup(head->next, k); head->next = pre; return head; } };
與前一題相似,比前一題較難。採用遞迴,很好解決,使用時間也較少。
涉及到連結串列指標的題目都還比較好想。