题目
题目链接
. - 力扣(LeetCode)
题目描述
代码实现
class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {if(k == 1) return head;//特殊情况ListNode *cur = head;for(int i = 1; i < k; i++){if(cur == nullptr ||cur->next == nullptr) return head;else cur = cur->next;}ListNode *next = cur->next;cur->next = nullptr;reverseList(head);ListNode *p = reverseKGroup(next, k);head->next = p;return cur;}ListNode* reverseList(ListNode* p){//完成链表反转if(p->next == nullptr || p == nullptr) return p;ListNode *newHead = reverseList(p->next);p->next->next = p;p->next = nullptr;return newHead;}
};
思路分析
首先,这题我用到的递归的思路。
1、在链表中找到k个节点,从右边断开,成为独立的一个链表,完成反转。
2、完成反转的尾节点和后边完成k个节点反转的链表连接起来。
3、考虑递归的出口,当节点不足k个的时候,直接返回头节点即可。
4、最后考虑特殊情况,即当k为1的时候,直接返回头节点即可。
ps:上边的反转链表部分可以参考我的这篇博文
反转链表+牛客-CSDN博客
图示如下。