利用递归每次走到第k个节点时,依次倒序返回节点pre,让目前节点n执行pre
用pretail和nexthead标记上次排序完的尾节点和下次排序前的头节点,并且让pretail指向nexthead,这一过程在每次递归到最后时实现,
这样的话如果最后出现个数小于k不用排序时可以直接退出,不进行排序
代码如下:
class Solution {
int exit;
ListNode nexthead=null;
ListNode pretail=null;
ListNode thishead=null;
public ListNode reverseKGroup(ListNode head, int k) {
ListNode p = new ListNode(0,null);
int i=0;
exit=0;
if(head==null||head.next==null)return head;
if(k==1)return head;
nexthead=head;
pretail=p;
while(nexthead!=null){
sort(nexthead,k);
}
return p.next;
}
public void sort(ListNode n,int k){
pretail=sort(n,1,k);
if(exit!=1)pretail.next=nexthead;
}
public ListNode sort(ListNode n,int i,int k){
if(i==k){
nexthead = n.next;
thishead = n;
pretail.next=n;
return n;
}
else{
if(n.next==null){
exit=1;
nexthead=null;
return null;
}
ListNode pre = sort(n.next,i+1,k);
if(exit!=1){
pre.next=n;
}
else{
return null;
}
return n;
}
}
}