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;
}
}