思路:顺序遍历,记录反转的第一个节点和最后一个节点,写一个逆置函数即可。 因为在翻转途中会涉及到断链的问题,因此我们需要做以下准备工作: 1.插入一个头节点。 2.记录开始翻转节点的前驱与翻转结束节点的后继,以便拼接链表。 其中,设置一个temp节点,用来记录当前翻转结束的最后一个节点。每次翻转之后正常拼接,将前驱节点设置为temp节点。最后有冗余的节点就直接忽略(不翻转)。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    public ListNode reverseKGroup (ListNode head, int k) {
        
        ListNode ph = new ListNode(0);
        ph.next = head;
        ListNode p = head;
        int count = 0;
        ListNode pre = ph;
        ListNode next;
        ListNode temp;
        while(p!=null){
            count++;
            if(count==k){
                next = p.next;
                p.next=null;
                temp =reverse(pre);
                temp.next=next;
                count=0;
                pre = temp;
                p=temp.next;
            }
            else 
                p = p.next;
        }
        return ph.next;
    }
    ListNode reverse(ListNode head){
        ListNode ph = head.next;
        ListNode p = head.next;
        ListNode q = p.next;
        p.next = null;
         ListNode h ;
        while(q!=null){
           h = q.next;
           q.next = p;
           p =q;
           q = h;
        }
        head.next = p;
        return ph;
    }
}