【力扣专题栏】K个一组对链表进行翻转,如何实现分组翻转链表?
题解目录
- 1、题目描述+解释
- 2、算法原理解析
- 3、代码编写
1、题目描述+解释
2、算法原理解析
3、代码编写
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
//1、计算链表节点数量
ListNode* cur=head;
int NodeNumber=0;
while(cur)
{
NodeNumber++;
cur=cur->next;
}
//2、计算有多少组
int GroupNuber=NodeNumber/k;
//3、每k个节点一组进行头插,先创建新链表的哨兵位
ListNode* NewHead=new ListNode(0);
ListNode* tmp=NewHead;//更新头插位置的指针
ListNode* prev=NewHead;//进行头插的指针
cur=head;//原表从头开始
int i=0;
for(i=0;i<GroupNuber;i++)
{
//每k个为一组
int j=0;
tmp=cur;
for(j=0;j<k;j++)
{
//头插,临时指针记录原链表的下一个节点
ListNode* next=cur->next;
cur->next=prev->next;
prev->next=cur;
cur=next;
}
//内循环结束表示一组的节点头插完了,然后更新头插指针的位置
prev=tmp;
}
//4、记得把没有翻转的节点链接到新链表
prev->next=cur;
//5、释放
cur=NewHead->next;
delete NewHead;
return cur;
}
};