一、题目
二、思路
1、先统计总结点个数,将其分组
2、对每一组进行反转,反转方式为三个指针
3、建立两个容器,统计每个分链表的第一个和最后一个节点
3、将两个容器连接起来
三、代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
if(head ==nullptr || head->next==nullptr)
{
return head;
}
ListNode *node=head;
int NodeNum=0;
//统计节点个数
while(node)
{
NodeNum++;
node=node->next;
}
//计算多少组
int GroupNum=NodeNum/k;
//计算最后一组多少个节点
int ResNum=NodeNum%k;
//创建容器存储反转链表的第一个节点和最后一个节点
vector<ListNode*>FirstNode;
vector<ListNode*>LastNode;
//开始反转
ListNode *cur=head;
ListNode *pre=nullptr;
ListNode *nxt=nullptr;
for(int i=0;i<GroupNum;++i)
{
pre=nullptr;
LastNode.emplace_back(cur);
for(int j=0;j<k;++j)
{
nxt=cur->next;
cur->next=pre;
pre=cur;
cur=nxt;
}
FirstNode.emplace_back(pre);
}
FirstNode.emplace_back(cur);
//处理最后剩余的部分,这里题目不做处理
/*
for(int i=0;i<ResNum;++i)
{
//添加反转后最后一个节点
LastNode.emplace_back(cur);
nxt=cur->next;
cur->next=pre;
pre=cur;
cur=nxt;
//添加反转后第一个节点
FirstNode.emplace_back(pre);
}
*/
//将两个容器进行链接
ListNode *OutPut=FirstNode[0];
//最后一个指向下一个链表的第一个
//LastNode容器少一个
for(int i=0;i<LastNode.size();++i)
{
LastNode[i]->next=FirstNode[i+1];
}
return OutPut;
}
};