代码分析

使用next保留现场

while(cur!=null)
{
      next=cur.next;
      if(count==K)
      {
             //逆置
            count=0;
      }
      cur=next;
      count++;
}

变形之后的链表逆置

分析一下逆置中需要什么
1,肯定需要一个逆置的起点
2,逆置之前的节点
3,逆置之后的节点 next
2,3两个变量,我们分辨将他们命名为left,right
right就是我们的next,left最开始是null,一次结束之后,我们将当前的节点设置为left即可
如何解决1呢

start=left==null?head:pre.next;

逆置的话,从start的下一个节点开始

代码实现

public static ListNode reverseKGroup(ListNode head,int K)
    {
        ListNode next=null;
        ListNode cur=head;
        ListNode start=head;
        ListNode left=null;
        int count=1;
        while(cur!=null)
        {
            next=cur.next;
            if(count==K)
            {
                start=left==null?head:left.next;
                head=left==null?cur:head;
                region(left,next,start);
                left=start;
                count=0;
            }
            count++;
            cur=next;
        }
        return head;
    }
    public static void region(ListNode left,ListNode right,ListNode start)
    {
        ListNode next=null;
        ListNode pre=start;
        ListNode cur=start.next;
        while(cur!=right)
        {
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        if(left!=null)
        {
            left.next=pre;
        }
        start.next=right;
    }

完成情况

1 次