题意:
将给出的链表中的节点每 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;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号