问题
解决方案
以N为一个组,翻转这个组形成单链表,然后再链接下一个已经翻转的组
主要就是解决分组的问题,把组分好了之后,就可以对每个组做单链表的翻转,然后再把每个组的尾节点返回。
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if (head == nullptr) return head;
int curNum = 1;
ListNode* curHead = head;
ListNode* curTail = curHead;
// 找到组的最后一个节点
while (curTail != nullptr && curNum < k) {
curTail = curTail->next;
if (curTail == nullptr) break;
curNum++;
}
//要判断是否够一个组,不够不翻转
if (curNum == k) {
//需要把下一个分组的头节点记下来,因为要把当前组分割
ListNode* nextHead = curTail == nullptr ? nullptr : curTail->next;
//分割组
if (curTail != nullptr) curTail->next = nullptr;
//翻转当前组
reverseSingleList(curHead);
//当前组的头节点翻转后变成尾节点,尾结点链接下一个组的头结点
curHead->next = reverseKGroup(nextHead, k);
} else if (curNum < k) {
return curHead;
}
return curTail;
}
private:
// 这个是递归翻转单链表
ListNode* reverseSingleList(ListNode* head) {
if (head->next == nullptr) return head;
ListNode* next = reverseSingleList(head->next);
next->next = head;
return head;
}
题目主要使用递归,使用递归代码会写得易懂干净一点,但是边界条件一定要考虑清楚。