我居然一口气写下来了,夸夸自己~
虽然看到难度是红色的困难有点被吓到,但是只要有思路&注意细节,这题不难做。

下面代码的思路:

  1. 求出链表的总长度,方便截断最末段的不是整数倍的结点。
  2. 进行count / k次反转操作。
  3. 每次翻转k个结点,翻转方式随意,可以参考反转链表2里面的方法。
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 统计链表长度,方便对不足k个的最末段进行处理
        int count = 0;
        ListNode cur = head;
        while(cur != null){
            cur = cur.next;
            count++;
        }
        ListNode sentinel = new ListNode(0);
        sentinel.next = head;
        ListNode pre = sentinel;
        cur = head;
        // 按K个一组进行翻转
        while(count > 0){
            count -= k;
            if(count < 0){
                break;
            }
            // 此时转换成反转链表中第m~n个结点
            ListNode newHead = null;
            ListNode tail = cur;
            // 反转k个结点
            for(int i = 0;i < k;i++){
                ListNode nextNode = cur.next;
                cur.next = newHead;
                newHead = cur;
                cur = nextNode;
            }
            pre.next = newHead;
            tail.next = cur;
            pre = tail;
        }
        return sentinel.next;
    }
}

这段代码还有改进的地方,一是循环次数,可以改成这样:
for(int i = 0;i < count / k;i++)
就不用特意地加一个if判断了。
再者就是我使用的翻转链表的思路不太好(或者说是太冗余,但它没有错误),看到Leecode评论区点赞第一的那位使用的是"删除插入"(即删除掉要反转的结点,把它插入到最前面,一路地删除插入删除插入……)要比我的简便许多。