leetcode 25. K 个一组翻转链表
程序员文章站
2022-07-08 14:52:56
...
class Solution {
public ListNode caltail(ListNode pretail,ListNode head,int k){//上一组的尾巴,当前组的头 返回当前组的尾巴
//反转完之后 将pretail的next指向反转后的当前组的头,反转后当前组的尾巴指向原来头指向的next
ListNode curhead=head,curtail=null,curnext=null;//当前组未反转前的head,tail,next;
int i=1;
ListNode now=head,tmp=now.next,tmpnext=(tmp!=null)?tmp.next:null;
for(;i<k&&tmp!=null;++i){
if(i==k-1){curtail=tmp;curnext=tmpnext;}
tmp.next=now;now=tmp;tmp=tmpnext;//反转
tmpnext=(tmp!=null)?tmp.next:null;
}
if(i!=k){//说明最后组不够k个 将他们重新反转过来
curtail=now;curnext=null;//更新curtail
//将其反转过来
tmp=now.next;tmpnext=(tmp!=head&&tmp!=null)?tmp.next:null;
//这里直接 tmpnext=(tmp!=null)?tmp.next:null; 就可以啦
while(now!=head){
tmp.next=now;now=tmp;tmp=tmpnext;
tmpnext=(tmp!=null)?tmp.next:null;
}
pretail.next=curhead;
curtail.next=curnext;
return curtail;
}
pretail.next=curtail;
curhead.next=curnext;
return curhead;
}
public ListNode reverseKGroup(ListNode sb, int k) {
if(k==1) return sb;
ListNode head=new ListNode();
head.next=sb;
ListNode now=head;
while(now.next!=null){now=caltail(now,now.next,k);}
return head.next;
}
}