题目描述
给出一个链表,每 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 };