每次处理k个结点中的三个结点中的中间结点,提到k个结点的第一个位置,一直到第k-1的位置
/**
* 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) {
ListNode *pre;
ListNode *p=head;
ListNode *q=head;
if(!p||k==1) return p;
for(int i=1;i<k;i++){
if(!q->next) return head;
q=q->next;
}
pre=p;
head=q;
while(p->next!=head){ //处理三个结点中的中间结点
q=p->next;
p->next=p->next->next;
q->next=pre;
pre=q;
}
p->next=reverseKGroup(head->next,k);
head->next=pre; //处理k个中最后一个结点
return head;
}
};