给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
捋逻辑
if链表头空、K=1、K=0的话都是不用翻转的
还要知道一共有多少个节点,节点数L,创建一个指针指向链表头
循环
{
L+1
指针往后指一个
}
要是节点数比K小的话,那也不用翻转
选出k个节点,创建一个指针t先指向链表的头节点
循环int i <k时
{
只要指针不指向空,就向后推一位
}
这k个节点开始翻转过程
改变链表的指向
递归下一组K
代码:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(head==nullptr||k==1||k==0) return head;
int L=0;
ListNode* len=head;
//知道一共多少节点
while(len!=nullptr)
{
++L;
len=len->next;
}
if(L<k)return head;
//K个一组
ListNode* tail=head;
for(int i=0;i<k;++i)
{
if(tail==nullptr)return nullptr;
tail=tail->next;
}
//翻转,改变链表的指向
ListNode* pre=nullptr,* next=nullptr,* cur=head;
while(cur!=tail)
{
next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
//递归
head->next=reverseKGroup(tail,k);
return pre;
}
};
这题中的一个部分是另一道题,顺便一起写在这里吧!
反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
就是上一道题反转的部分。
直接写代码吧!
class Solution {
public:
//开始给出了头节点
ListNode* reverseList(ListNode* head) {
ListNode* pre= nullptr,* next;
while(head)
{
//保存好head指针的下一个指针
next = head->next;
//反转head指针的指向
head->next=pre;
//依次往后挪
pre=head;
head=next;
}
return pre;
}
};