描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表。如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样。你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度 O(n)
例如:
给定的链表是1→2→3→4→5
对于 k = 2 , 你应该返回2→1→4→3→5
对于 k = 3 , 你应该返回3→2→1→4→5
示例1
输入:{1,2,3,4,5},2
返回值:{2,1,4,3,5}
示例2
输入:{},1
返回值:{}
代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
if(head==nullptr)
return head;
ListNode *now=new ListNode(0);
int m=0;
ListNode *p,*q;
p=head;
int len=0;
while(p){
p=p->next;
len++;
}
if(k>len)
return head;
int sum=len/k;
p=head;
q=now;
while(p&&sum>0){
ListNode *h=p->next;
p->next=q->next;
q->next=p;
p=h;
m++;
if(m==k){
m=0;
while(q->next){
q=q->next;
}
sum--;
}
}
q->next=p;
return now->next;
}
};