链表中的节点每k个一组翻转
描述
将给出的链表中的节点每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
/**
* 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
ListNode* pn=nullptr;
ListNode* cn=head;
ListNode* nn=nullptr;
ListNode* newhead=nullptr;
ListNode* left0=nullptr;
ListNode* left1=nullptr;
int i=0,len=0,grouplen=0;
while(cn!=nullptr){
len++;
cn=cn->next;
}
if(len==1||k==1||k>len||head==nullptr)
return head;
grouplen=len-len%k;//计算翻转的长度
i=0;
cn=head;
while(i<grouplen){
if((i%k)==0 && (i/k)%2==0)
left0=cn;
else if((i%k)==k-1 && (i/k)%2!=0)
left0->next=cn;//将上一组的最左边结点指向这一组的最右边结点,将两组拼接起来
else if(i%k==0 && (i/k)%2!=0)
left1=cn;
else if(i%k==k-1 && (i/k)%2==0 && i/k>0)
left1->next=cn;//将上一组的最左边结点指向这一组的最右边结点,将两组拼接起来,第一组的最右边结点跳过
else if(i==k-1)
newhead=cn;
nn=cn->next;
cn->next=pn;
pn=cn;
cn=nn;
i++;
}
if((i/k)%2==0)
left1->next=cn;
else
left0->next=cn;
return newhead;
}
};