package com. my. util;
public class SingleNode {
public int value;
public SingleNode next;
public SingleNode ( int data) {
this . value = data;
}
}
package com. my. suanfa;
import java. util. Stack;
import com. my. util. SingleNode;
public class Solution09 {
public SingleNode reverseKNodes1 ( SingleNode head, int k) {
if ( k < 2 ) {
return head;
}
SingleNode newHead = head;
SingleNode pre = null;
SingleNode next = null;
SingleNode cur = head;
Stack< SingleNode> stack = new Stack < SingleNode> ( ) ;
while ( cur != null) {
next = cur. next;
stack. push ( cur) ;
if ( stack. size ( ) == k) {
pre = resign1 ( stack, pre, next) ;
newHead = newHead == head ? cur : newHead;
}
cur = next;
}
return newHead;
}
public SingleNode resign1 ( Stack< SingleNode> stack, SingleNode left, SingleNode right) {
SingleNode cur = stack. pop ( ) ;
if ( left != null) {
left. next = cur;
}
SingleNode next = null;
while ( ! stack. isEmpty ( ) ) {
next = stack. pop ( ) ;
cur. next = next;
cur = next;
}
cur. next = right;
return cur;
}
public SingleNode reverseKNodes2 ( SingleNode head, int k) {
if ( k < 2 ) {
return head;
}
SingleNode pre = null;
SingleNode next = null;
SingleNode start = null;
SingleNode end = head;
int count = 1 ;
while ( end != null) {
next = end. next;
if ( count == k) {
head = pre == null ? end : head;
start = pre == null ? head : pre. next;
resign2 ( pre, start, end, next) ;
pre = start;
count = 0 ;
}
count++ ;
end = next;
}
return head;
}
public void resign2 ( SingleNode left, SingleNode start, SingleNode end, SingleNode right) {
SingleNode pre = start;
SingleNode cur = start. next;
SingleNode next = null;
while ( cur != right) {
next = cur. next;
cur. next = pre;
pre = cur;
cur = next;
}
if ( left != null) {
left. next = end;
}
start. next = right;
}
}