代码分析
使用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 次