链表中的节点每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;
}
};
标签:head,ListNode,cn,nullptr,next,链表,节点,翻转 来源: https://www.cnblogs.com/fishegg/p/16339668.html