LeetCode--25.k个一组翻转链表
解题思路:
1.获取信息:
(1)给定一个链表,每k个结点一组进行翻转
(2)余下不足k个结点,则不进行交换
2.分析题目:
其实就是24题的变题,24题是两两一组进行交换,这一道题就是多个一组进行交换
3.示例查验:
示例1和示例2:都用图表明了多个一组怎么进行交换
4.尝试编写代码:
我看见这道题,构思了三种方法,但我目前只实现了一种构思,后续我会补上其他的方法的,放心吧
这三种方法的核心思路都是一样的,或者说25题和24题的核心思路都是一样的,各个方法只是手法略有不同而已,手法好了,你可以叫做手法大师,哈哈
所以我下面方法的名字就是按手法来命名的,所以就直接看代码注释,我就不一 一讲解了
(1)辅助存储空间+迭代
以下是完整代码
class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {stack<ListNode*>s;//辅助存储空间bool first=true;//是否是第一个组合ListNode*res;//结果链表的首元结点ListNode*temp;//存储上一组结点翻转后的最后一个结点while(head!=nullptr){s.push(head);head=head->next;if(s.size()==k){//如果储存够了一组if(first){res=s.top();first=false;}//如果是第一组,我们储存下结果链表的首元结点else{temp->next=s.top();//不是第一组,就连接上一组结点翻转后的最后一个结点和下一组结点翻转后的第一个结点}while(s.size()-1){//进行翻转操作ListNode*now=s.top();s.pop();now->next=s.top();}temp=s.top();//留下一个结点用于连接下一组结点翻转后的第一个结点temp->next=nullptr;//处理结点断开问题s.pop();}}if(s.size()){//处理冗余结点不足k个的情况,就保持它们原有的顺序,不进行翻转,直接进行连接while(s.size()!=1)s.pop();temp->next=s.top();}return res;}
};
下面的两种手法,我在努力地实现,你也可以尝试一下,看它们是否可行,到时候来这里对答案哦,算是磨练一下你咯,宝剑锋从磨砺出,梅花香自苦寒来嘛
(2)使用辅助存储空间+递归
(3)不使用辅助存储空间+递归
哈哈,今天又是偷懒的一天,之前21题,我说了后续会补上第三种方法,现在虽然还没有补上,但也快了,我打算好好学习一下运算符重构,也要点时间的,但我说会补,那就一定会补上的
好了,早睡,还是提一嘴,纸上得来终觉浅,绝知此事要躬行