核心思想
  • 递归的方式
  • 每次判断待翻转链表是否小于K
  • 每k个结点翻转也用递归的方式
/**
 * struct ListNode {
 *	i/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode * reverse(struct ListNode * head, struct ListNode * tail)
{
    if(head->next == tail)
    {
       return head;
    }
    
    struct ListNode * newTail = NULL;
    newTail = reverse(head->next, tail);
    head->next->next = head;
    head->next = NULL;
    
    return newTail;
}

struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
    // write code here
    // 空链表
    if(head == NULL || k == 1)
    {
        return head;
    }
    
    // 从头开始,没k个结点翻转一次,直到没有结点或不足k个元素返回
    struct ListNode * curl = head;
    // i从0起步,curl从head开始,等跳出该循环时候,curl指的应该是第k+1个结点
    // 当然不足k个结点时候,就返回head了
    for(int i = 0; i < k; i++)
    {
        if(curl == NULL)
        {
            return head;
        }
        
        curl = curl->next;
    }
    
    // 每k个元素翻转,编写独立翻转函数。 
    struct ListNode * newTail = NULL;
    newTail = reverse(head, curl);
    
    head->next = reverseKGroup(curl , k);
    
    
    // 最终返回head
    return newTail;
}