【lettcode】链表中的节点每k个一组翻转

链表中的节点每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;
	}
};

猜你喜欢

转载自blog.csdn.net/weixin_52344401/article/details/124329755