解题思路:
主要利用递归的思想,也就是说把每个片段(K划分)重复反转:
1,找出要反转的片段,以确认每片段反转的结束;
2,按照正常的链表翻转流程,把链表翻转;
3,利用递归的思想来完成下一个片段的翻转,在翻转前需要完成链表的拼接。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
if(k == 0){
return head;
}
ListNode* pre = nullptr;
ListNode* CutStart = head;
ListNode* CutEnd = nullptr;
ListNode* Aux = head;
for(int i = 0; i < k; i++){
// 这里的判断条件要前置,
//以防止全翻转时直接返回head也就是对原来链表不做为
if(Aux == nullptr){
return head;
}
Aux = Aux->next; // 找到翻转片段的尾部
}
// 按照正常翻转进行链表的翻转
while(CutStart != Aux){
ListNode* tempNode = CutStart ->next;
CutStart->next = pre;
pre = CutStart;
CutStart = tempNode;
}
// 接着需要进行链表片段的拼接
// 这里需要注意的是:虽然反转了,但是原来的头还是头
CutEnd = head;
head = pre;
// CutEnd的下一个本来是空,所以这个递归要注意
CutEnd->next = reverseKGroup(Aux, k);
return head;
}
};

京公网安备 11010502036488号