標籤:turn 額外 new int struct 題目 節點 長度 solution
題目描述
給出一個鏈表,每 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 };
LeetCode 25. k個一組翻轉鏈表(Reverse Nodes in k-Group)