欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 25. K 个一组翻转链表

程序员文章站 2022-07-08 14:52:56
...

题目
leetcode 25. K 个一组翻转链表

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;
    }
}
相关标签: LeetCode # 链表