【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 };
原文地址:https://www.cnblogs.com/Asumi/p/12514368.html