力扣打卡10:K个一组翻转链表
链接:25. K 个一组翻转链表 - 力扣(LeetCode)
这道题需要在链表上,每k个为一组,翻转,链接。
乍一看好像比较容易,其实有很多细节。比如每一组反转后怎么找到上一组的新尾,怎么找到下一组的新头。并且进阶做法需要空间O(1)。只能遍历一个链表。
我将题大致分为几步:
1.用l,r指针作移动窗口,划定当前组(通过固定l,移动r)
2.将本组的头,尾结点记录。
3.翻转当前组
4.将上一个组的尾连接当前组的新头。
再注意一些长度不足,第一组等细节,就可以解题。
我的代码:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(k==1) return head;
ListNode *a,*b,*c,*l,*r,*t;
a=b=c=l=r=t=head;
ListNode *m=nullptr;
bool flag=0;
while(1)
{
for(int i=1;i<k;i++)
{
if(r==nullptr) break;
r=r->next;
}
if(r==nullptr) break;
if(flag==0){flag=1; t=r;}
else m->next=r;
a=m; b=l; c=l->next; m=l; l=r->next;
while(c!=r->next)
{
b->next=a;
a=b;
b=c;
c=c->next;
}
b->next=a; r=l;
}
if(flag==1) m->next=l;
return t;
}
};
原文地址:https://blog.csdn.net/Bigkinder/article/details/144333057
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!