content: 
  
  package class04;
  
  // 测试链接：https://leetcode.com/problems/reverse-nodes-in-k-group/
  public class Code04_ReverseNodesInKGroup {
  
  	// 不要提交这个类
  	public static class ListNode {
  		public int val;
  		public ListNode next;
  	}
  
  	public static ListNode reverseKGroup(ListNode head, int k) {
  		ListNode start = head;
  		ListNode end = getKGroupEnd(start, k);
  		if (end == null) {
  			return head;
  		}
  		// 第一组凑齐了！
  		head = end;
  		reverse(start, end);
  		// 上一组的结尾节点
  		ListNode lastEnd = start;
  		while (lastEnd.next != null) {
  			start = lastEnd.next;
  			end = getKGroupEnd(start, k);
  			if (end == null) {
  				return head;
  			}
  			reverse(start, end);
  			lastEnd.next = end;
  			lastEnd = start;
  		}
  		return head;
  	}
  
  	public static ListNode getKGroupEnd(ListNode start, int k) {
  		while (--k != 0 && start != null) {
  			start = start.next;
  		}
  		return start;
  	}
  
  	public static void reverse(ListNode start, ListNode end) {
  		end = end.next;
  		ListNode pre = null;
  		ListNode cur = start;
  		ListNode next = null;
  		while (cur != end) {
  			next = cur.next;
  			cur.next = pre;
  			pre = cur;
  			cur = next;
  		}
  		start.next = end;
  	}
  
  }