题意:
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 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; } };
时间复杂度:空间复杂度: