25. k个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
1 2 3
| 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5
|
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Solution { public: void reverseK(ListNode*& cur, int k) { ListNode* head = cur; ListNode* tail = NULL; ListNode* pre = cur->next; ListNode* back = pre->next; for(int i = 1;i < k;i++) { pre->next = tail; tail = pre; pre = back; back = back->next; } pre->next = tail; cur->next = pre; for(int i = 0;i < k;i++) { cur = cur->next; } cur->next = back;
} void PrintList(ListNode* head) { while(head != NULL) { cout << head->val << " "; } cout << endl; }
ListNode* reverseKGroup(ListNode* head, int k) { int count = 0; ListNode* H = new ListNode(0); H->next = head; ListNode* tmp = head; while(tmp != NULL) { tmp = tmp->next; count++; } tmp = H; while(count >= k) { reverseK(H, k); count -= k; } return tmp->next; } };
|
解释:大致的想法就是先遍历一遍链表,然后记录下链表的个数count
每k个进行一次翻转,然后count - k,直到count < k,则停止循环
翻转的过程如下图:

v1.5.2