Given a linked list, reverse the nodes of a linked list k at a time
and return its modified list.

k is a positive integer and is less than or equal to the length of the
linked list. If the number of nodes is not a multiple of k then
left-out nodes in the end should remain as it is.

Example:

Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

Note:

Only constant extra memory is allowed. You may not alter the values in
the list's nodes, only nodes itself may be changed.
翻转链表的问题,主要是处理周期性的翻转,如何知道现在的链表是否可以翻转,我们可以预先移动一个指针

public ListNode reverseKGroup(ListNode head, int k) {    ListNode trueHead=new ListNode(0);    trueHead.next=head;    ListNode preEnd=trueHead;    while(preEnd.next!=null){        ListNode end=preEnd;        for(int i=0;i<k && end!=null;i++) end=end.next;        if(end==null) break;        ListNode pre=end.next;        ListNode cur=preEnd.next;        for(int i=0;i<k;i++){            ListNode next=cur.next;            cur.next=pre;            pre=cur;            cur=next;        }        ListNode start=preEnd.next;        preEnd.next=pre;        preEnd=start;    }    return trueHead.next;}