1. 程式人生 > >LeetCode 25. k個一組翻轉連結串列(Reverse Nodes in k-Group)

LeetCode 25. k個一組翻轉連結串列(Reverse Nodes in k-Group)

題目描述

 

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

是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 的整數倍,那麼將最後剩餘節點保持原有順序。

示例 :

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

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

當 = 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 };