【Leetcode】K 个一组翻转链表
题目链接:K 个一组翻转链表
题意:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
题解:先统计一下链表的长度,k个一组,分成n/k组,然后每组翻转k-1次。
翻转的过程如图所示。画图真的对做链表题很管用啊。QAQ
也是做完这个操作以后,再更新一下cur和pre即可。
代码:
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* ans = new ListNode(0); 13 ListNode* pre = ans; 14 ListNode* cur = head; 15 ListNode* tail =ans; 16 17 ans->next = head; 18 //统计链表长度 19 int len = 0; 20 while(head){ 21 head = head->next; 22 len++; 23 } 24 25 //k个一组 26 for(int i = 0 ; i < len/k ; i++){ 27 for(int j = 1; j <= k-1 ;j++){ //翻转k-1次 28 tail = cur->next; 29 30 cur->next = tail->next; 31 tail->next = pre->next; 32 pre->next = tail; 33 } 34 pre = cur; 35 cur = pre->next; 36 } 37 38 return ans->next; 39 } 40 };