/*
看这蛮长的,其实思路还是很简单的,他要求O(1)的空间复杂度,但是用到了队列,先说思路吧
求链表长度,除于k,看组的个数,将每一组分成一个子链表,对子链表求逆序,然后返回头节点,
然后上一组的尾节点指向返回的头节点,这里调用逆序之前得记录最后一组最后一个得下一个,是
为了逆序好所有的组之后为节点连上刚刚的记录的节点,这里用队列是因为下一组得头节点不好记录
干脆用链表在开始遍历时记录下来
*/
#include <queue>
#include <stack>
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKChildGroup(ListNode* head,int k)
{
ListNode *pre = nullptr;
ListNode *mid = head;
ListNode *next = mid->next;
int num = k-1;
while(num--)
{
mid->next = pre;
pre = mid;
mid = next;
next = next->next;
}
mid->next = pre;
return mid;
}
ListNode* reverseKGroup(ListNode* head, int k)
{
if(!head||!head->next||k<=1) return head;
int size = 0;//节点个数
ListNode *ptail;
ListNode *pNode = head;
ListNode *ptemp = head;
queue<ListNode*>que;
int t = 0;
while (pNode)
{
t++;
size++;
pNode = pNode->next;
if(k == t)
{
que.push(pNode);
t=0;
}
}
if(k>size) return head;
pNode = head;
int Index = 0;
while(Index<((size/k)*k))
{
Index++;
ptemp=ptemp->next;
}
for(int i = 0;i<(size/k);i++)
{
if(i==0)
{
head = reverseKChildGroup(pNode, k);
ptail = head;
}
else
{
int j = k-1;
while(j--)
{
ptail = ptail->next;
}
ptail->next = reverseKChildGroup(que.front(), k);
ptail=ptail->next;
que.pop();
}
}
if(ptemp)
{
int j = k-1;
while(j--)
{
ptail = ptail->next;
}
ptail->next = ptemp;
}
return head;
}
};