一、题目解析
1、每k个一组进行翻转
2、不允许单纯交换节点内部的值
二、算法原理
解法:模拟
1、遍历链表得到总节点数n,n/=k,得到需要翻转的组数n
利用cur遍历链表,若cur不为空,则n++,cur=cur->next
2、重复n次,长度为k的链表逆序,使用头插法
我们tmp记录每组第一个插入的节点,为了便于下组头插
3、剩下的直接链接到后面,释放哨兵位头结点
三、代码示例
cpp
复制代码
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k)
{
//先求需要翻转的组数n
int n = 0;
ListNode* cur = head;
while(cur)
{
n++;
cur = cur->next;
}
n/=k;
ListNode* newhead = new ListNode(0);
cur = head;
ListNode* tmp = nullptr,*prev = newhead,*next = nullptr;
//重复n次长度为k的链表翻转
while(n--)
{
tmp = cur;
for(int i = k;i>0;i--)
{
if(cur)
next = cur->next;
if(cur)
cur->next = prev->next;
prev->next = cur;
cur = next;
}
prev = tmp;
}
//链接剩下的节点
prev->next = cur;
cur = newhead->next;
//释放哨兵位头结点
delete newhead;
return cur;
}
};
看到最后,如果对您有所帮助,还请点赞、收藏和关注支持一波,我们下期再见!