K个一组反转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

本题思路并不难得出,只是在实现上需要注意的细节较多。设置一个计数器n,以及p1,p2划分出当前区间,当n是k的倍数时反转该区间的链表(特别地,当n==k时将ans置为当前节点),设置一个temp为已排序链表的尾部,初始时为空,每次反转之前先将p2接在temp后,设置一个ne节点存储p2的下一个节点,然后反转区间内链表,将temp移到p1,将p1与p2都移动到ne。

当跳出循环时,若有剩余节点未反转(即n%k!=0),此时p1位于剩余节点头部,其尾部未反转处于置空状态,将p1接到p2之后并返回ans即可,若无剩余节点未反转,因为每次反转过程中都会将尾部置空,返回ans即可。

class Solution {
    //用于反转从head到end之间的链表,并将尾节点后置空
    public ListNode reverse(ListNode head,ListNode end){
        if(head==null||head.next==null)
           return head;
        ListNode n1=head,n2=head.next,n3=n2.next;
        while(n3!=null&&n2!=end){
            n2.next=n1;
            n1=n2;
            n2=n3;
            n3=n3.next;
        }
        n2.next=n1;
        head.next=null;
        return n2;
    }

      public ListNode reverseKGroup(ListNode head, int k) {
        if(k==1)
           return head;
        ListNode dummyhead=new ListNode();
        ListNode temp=dummyhead;
        ListNode ans=null;

        ListNode p2=head,p1=head;
        int n=0;
                
        while(p2!=null){
            if(p2!=null)
                n++;

            if(n==k)
                ans=p2;

            if(n%k==0){
                temp.next=p2;
                ListNode ne=p2.next;
                reverse(p1,p2);
                temp=p1;
                p2=ne;
                p1=p2;
            }else{
                p2=p2.next;
            }
        }
        if(n%k!=0)
           temp.next=p1;
        return ans;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容