public static Node reversek(Node head,int k){
if(k<2) return head;
Node cur=head; //当前结点
Node next=null; //下一结点
Node pre=null; //上一组数逆序后的最后一个
Node start=null;//本组开始结点
int count=1;
while(cur!=null){
next=cur.next; //下一结点
if(count==k){
start=pre==null?head:pre.next;//本组数上一个结点
head=pre==null?cur:head; //第一組的逆序前的第k个节点
resign(pre,start,cur,next); //逆序
pre=start; //上一组数逆序之前的第一个,逆序之后的最后一个
count=0;
}
count++;
cur=next; //当前结点指向下一个
}
return head;
}
public static void resign(Node left, Node start, Node end, Node right) {
Node pre=start; //前一结点
Node cur=start.next; //当前结点
Node next=null; //后一结点
while(cur!=right){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
if(left!=null){ //上一组逆序后最后一个结点不空
left.next=end;
}
start.next=right; //连上下组第一个结点
}
if(k<2) return head;
Node cur=head; //当前结点
Node next=null; //下一结点
Node pre=null; //上一组数逆序后的最后一个
Node start=null;//本组开始结点
int count=1;
while(cur!=null){
next=cur.next; //下一结点
if(count==k){
start=pre==null?head:pre.next;//本组数上一个结点
head=pre==null?cur:head; //第一組的逆序前的第k个节点
resign(pre,start,cur,next); //逆序
pre=start; //上一组数逆序之前的第一个,逆序之后的最后一个
count=0;
}
count++;
cur=next; //当前结点指向下一个
}
return head;
}
public static void resign(Node left, Node start, Node end, Node right) {
Node pre=start; //前一结点
Node cur=start.next; //当前结点
Node next=null; //后一结点
while(cur!=right){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
if(left!=null){ //上一组逆序后最后一个结点不空
left.next=end;
}
start.next=right; //连上下组第一个结点
}