1. 程式人生 > >LeetCode 25. k個一組翻轉鏈表(Reverse Nodes in k-Group)

LeetCode 25. k個一組翻轉鏈表(Reverse Nodes in k-Group)

lse etc list listnode else 保存 進行 family 示例

題目描述

給出一個鏈表,每 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)