思路,同LeetCode.24 唯一不同就是现在是k个一组反转,那就设置pBegin作为反转节点的首段,pEnd作为反转节点的末端,调用函数反转部分链表(大多做过)
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode* reverseKGroup(ListNode* head, int k)
{
if (head == NULL || k == 0)
return NULL;
ListNode vir(-1);
ListNode* pZero = &vir;
pZero->next = head;
ListNode* pBegin = head;
ListNode* pEnd = head;
int temp = k - 1;
while (pBegin->next != NULL && temp)
{
pBegin = pBegin->next;
temp--;
}
ListNode* pHead = temp ? head : pBegin;
pBegin = head;
temp = k - 1;
while (pBegin->next != NULL)
{
while (pEnd->next != NULL && temp)
{
pEnd = pEnd->next;
temp--;
}
if (!temp)
{
ListNode* pTemp = NULL;
if (pEnd->next != NULL)
pTemp = pEnd->next;
ListReverse(pBegin, pEnd, pZero);
if (pTemp != NULL)
{
pZero = pBegin;
pBegin = pTemp;
temp = k - 1;
pEnd = pBegin;
}
}
else
break;
}
if (temp)
pZero->next = pBegin;
return pHead;
}
void ListReverse(ListNode* pBegin, ListNode* pEnd, ListNode* pZero)
{
ListNode* pCur = pBegin;
ListNode* pNext = pBegin->next;
ListNode* pPrev = NULL;
while (pCur != pEnd)
{
pCur->next = pPrev;
ListNode* pTemp = pNext->next;
pNext->next = pCur;
pPrev = pCur;
pCur = pNext;
pNext = pTemp;
}
pZero->next = pEnd;
}
};
ac为96.96%(不准,仅供参考)
过一段时间再刷了,好好弄毕设中期了。