LeetCode 25. k個一組翻轉連結串列(Reverse Nodes in k-Group)
阿新 • • 發佈:2018-10-31
題目描述
給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。
k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。
示例 :
給定這個連結串列:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
說明 :
- 你的演算法只能使用常數的額外空間。
- 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
解題思路
首先遍歷整個連結串列得到總長度,然後每k個節點依次反轉,每次儲存當前節點反轉後的首節點和尾節點,以便拼接上下k個節點的連結串列;在第一次反轉後記錄新連結串列的首節點;最後節點不足k個時,把上一次反轉後連結串列的尾節點拼接到之後的節點。
程式碼
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next;6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* reverseKGroup(ListNode* head, int k) { 12 ListNode *left = head, *right = head, *newHead = NULL; 13 int len = 0; 14 while(right){ 15 len++; 16 right = right->next;17 } 18 if(len < k) return head; 19 right = head; 20 while(len >= k){ 21 ListNode *node = right; 22 ListNode *h = right; 23 right = right->next; 24 for(int i = 0; i < k-1; i++){ 25 ListNode *next = right->next; 26 right->next = node; 27 node = right; 28 right = next; 29 } 30 if(newHead == NULL) newHead = node; 31 else{ 32 left->next = node; 33 left = h; 34 } 35 len -= k; 36 } 37 left->next = right; 38 return newHead; 39 } 40 };