import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
      public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
         if (head == null) {
            return null;
        }
        int n = 0;
        ListNode cur = head;
        while (cur != null) {
            n += 1;
            cur = cur.next;
        }
        if (n < k) {
            return head;
        }
  
        ListNode pre = head;
        cur = head.next;
        int index = 1;
        while (index < k) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
            index += 1;
        }
        head.next = reverseKGroup(cur, k);
        return pre;
    }
}

本题知识点分析:

1.链表遍历

2.链表反转

3.链表赋值

4.前驱结点和后继结点

本题解题思路分析:

1.n用于计算链表长度

2.如果链表长度小于k不需要进行翻转,直接返回头结点

3.接下来,定义两个指针pre和cur,分别指向当前需要反转的k个节点的前一个节点和第一个节点。同时,使用索引index初始化为1,表示已经反转了一个节点。然后,将第一个节点cur的next指针指向pre,完成节点的反转。

4.接着,更新pre为cur,cur为下一个节点,同时将index加1。重复上述步骤,反转余下的k-1个节点,直到index等于k。

5.在反转完k个节点后,将反转后的链表的头节点连接到下一组反转后的链表的头节点,即head.next。然后,递归调用reverseKGroup方法,对剩余的部分进行反转,并将其与当前反转的k个节点连接起来。

6.最后,返回反转后的链表的头节点pre。

本题使用编程语言: Java