题意:
        将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
        如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
        你不能更改节点中的值,只能更改节点本身。

方法:
模拟

思路:
        模拟。
        首先,计算链表长度,反转区间个数=链表长度 / 区间长度。
        首先。新增头结点;
        然后,针对每个区间,反转区间;
        最后,返回答案链表。

图解如下:


class Solution {
public:
    
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head==nullptr)
            return head;
        ListNode *p=head;
        int n=0;//链表长度
        while(p){//统计链表长度
            n++;
            p=p->next;
        }
        int cnt=n/k;//反转区间的个数
        ListNode *h=new ListNode(0);
        h->next=head;//新增头结点
        //初始化
        ListNode *r=h;//r表示区间的前一个节点
        p=head;
        ListNode *q=head->next;
        ListNode *s,*t;//s表示区间的第一个节点
        while(cnt--){//循环cnt个区间
            s=p;
            for(int i=0;i<k-1;i++){//循环反转区间
                t=q->next;
                q->next=p;
                p=q;
                q=t;
            }
            r->next=p;//反转区间拼接
            s->next=q;
            
            r=s;//再次初始化
            p=q;
            q=q->next;
        }
        return h->next;
    }
};


时间复杂度:
空间复杂度: