链表中的节点每k个一组翻转
思路:首先将要每K个一组翻转链表,我们可以先考虑当前应当怎么做?早在翻转链表一题当中,我们写的一个翻转的题中定义了pre,cur,并将cur != nullptr
作为一个结束条件,这样就将一个链表在nullptr的排序好了,那么我们可以借助这一点,提前设置一个节点为尾节点。tail节点
实际上翻转过程分为两个步骤,首先找到尾tail,其次翻转,翻转过后让头指向尾,此时递归到tail,让tail按照上述逻辑执行。
结束条件: 不满足K个元素直接返回head,表示不翻转。
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverse(ListNode* head, ListNode* tail)
{
ListNode* pre = nullptr;
ListNode* cur = head;
while (cur != tail)
{
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if(head == nullptr || head->next ==nullptr)
return head;
//进行翻转的链表返回头部
//确定尾部的位置
ListNode* tail = head;
//循环k次找尾,找不到返回头即可。
for (int i = 0; i < k; ++i)
{
if (tail)
tail = tail->next;
else
return head;//此时递归已经结束,可以返回了
}
//最终tail是第一次转换链表的头部
ListNode* ret = reverse(head, tail);
//head此时需要链接下一个逆转K个节点的头
head->next = reverseKGroup(tail, k);
//此时ret返回到第一个栈帧就是第一次翻转的头
return ret;
}
};