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

程浩
21 声望2 粉丝