leetcode 25. Reverse Nodes in k-Group (hard)

leetcode 25. Reverse Nodes in k-Group (hard)

class Solution
{
public:
	ListNode *reverseKGroup(ListNode *head, int k)
	{
		if (head == nullptr || head->next == nullptr || k < 2)
			return head;
		ListNode dummy(-1);
		dummy.next = head;

		ListNode *preGroupEnd = &dummy;
		ListNode *curGroupEnd = preGroupEnd->next;
		while (curGroupEnd = preGroupEnd->next)
		{
			for (int i = 1; i < k && curGroupEnd; i++)
				curGroupEnd = curGroupEnd->next;
			if (curGroupEnd == nullptr) // 剩余的不足k个
				break;
			preGroupEnd = reverseList(preGroupEnd, preGroupEnd->next, curGroupEnd);
		}
		return dummy.next;
	}
	// begin 和 end必须是闭区间
	ListNode *reverseList(ListNode *preGroupEnd, ListNode *begin, ListNode *end)
	{
		ListNode *endNext = end->next;
		ListNode *pre = begin;
		ListNode *cur = pre->next;
		ListNode *next = cur->next;
		while (cur != endNext)
		{
			cur->next = pre;
			pre = cur;
			cur = next;
			next = next ? next->next : nullptr;
		}
		begin->next = endNext;
		preGroupEnd->next = end;
		return begin;
	}
};