递归,每次取k个元素。然后对这k个元素处理,返回{k个元素}+reverseKGroup(tail,k)
比如1-2-3-4-5-6,k=4,那就先处理1-2-3-4,tail=5,5-6后续再处理。
处理过程是1(head,p1)-2(p2)-3-4,p1是当前最左边的元素,head是原来的头,p2是原来头下面的元素。
然后把p2移到p1左边:2(p1)-1(head)-3(p2)-4
然后再把p2移到p2左边:3(p1)-2-1(head)-4(p2)
一共移k-1次,最后得到4(p1)-3-2-1(head),p2=tail;
然后head=p1即可。
public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {int i;
if(head==null || k==1)
return head;
ListNode pre=new ListNode(0);
pre.next=head;
for(i=0;i<k;i++)
{
if(pre.next!=null)
pre=pre.next;
else
return head;
}
ListNode tail=pre.next;
ListNode p1=head;
ListNode p2=head.next;
i=1;
while(i<k)
{
head.next=p2.next;
p2.next=p1;
p1=p2;
p2=head.next;
i++;
}
head.next=reverseKGroup(tail,k);
head=p1;
return head;
}
}