当前位置:网站首页>链表中的节点每k个一组翻转
链表中的节点每k个一组翻转
2022-08-10 21:49:00 【干饭小白】
描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: \ 0 \le n \le 2000 0≤n≤2000 , 1 \le k \le 20001≤k≤2000 ,链表中每个元素都满足 0 \le val \le 10000≤val≤1000
要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如:
给定的链表是 1\to2\to3\to4\to51→2→3→4→5
对于 k = 2k=2 , 你应该返回 2\to 1\to 4\to 3\to 52→1→4→3→5
对于 k = 3k=3 , 你应该返回 3\to2 \to1 \to 4\to 53→2→1→4→5
本题已AC
解题思路:
拿到这题,一个想法就是用栈来写。至于为什么我会想到用栈呢?因为需要反向嘛,这里我看题目的要求,空间复杂度为 O(1)。第一个想法是保存值,通过 new一个新的节点了实现。但是仔细一想,好像不可以的,因为这样空间复杂度肯定不符合,突然灵机一动,我们可以用栈保存节点是指针,nice.
1→2→3→4→5 k = 2时
1→2→3→4→5 k = 3时
4和5是不用翻转的,所以如果用栈又会带来一个问题,因为栈结构是先进后出的,如果用栈来保存肯定会导致,4,5也会被翻转。
这里有两个解决方法,
1.把4,5再次入栈(入另一个栈),然后再输出 ok
2.不妨我们不使用栈结构,我们使用双向队列(而且双向队列在前后两端进行插入删除的效率也挺高的,所以我们使用这个结构最佳了)
我们哪一个例子来看:
1→2→3→4→5 k = 3时
准备工作,一个指向该链表的指针 head。一个deque,一个中间变量 tmpk
一些方便操作的辅助指针 s和ans
这里我们做一个循环,while(head != nullptr) 是的,一次遍历就可以搞定
此时退出循环,okk
判断 que是否为空或者tmpk是否等于 0
如果que不为空的话,说明que此时的节点是不需要翻转的
所以
那么这题就ok了,当然题目有一些细节,这个只能根据实际的测试清空来修改了
比如 {},2 {1,2},3 {1},2等
附上我通过的代码:
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
deque<ListNode*> sta;
int tmpk = k;
ListNode *s = nullptr;
ListNode *ans = nullptr;
while(head != nullptr)
{
sta.push_back(head);
head = head->next;
tmpk--;
if(tmpk == 0)
{
if(s == nullptr)
{
s = sta.back();
sta.pop_back();
ans = s;
}
while(!sta.empty())
{
s->next = sta.back();
sta.pop_back();
s = s->next;
}
tmpk = k;
}
}
while(!sta.empty())
{
if(s == nullptr)
{
s = sta.front();
sta.pop_front();
ans = s;
}
else
{
s->next = sta.front();
sta.pop_front();
s= s->next;
}
}
if(s != nullptr)
s->next = nullptr;
return ans;
}
};
边栏推荐
- 威纶通触摸屏如何在报警的同时,显示出异常数据的当前值?
- labelme-屏蔽拖拽的事件
- 【PCBA方案】电子握力测试仪方案she‘ji
- 3598. 二叉树遍历(华中科技大学考研机试题)
- Regular expression of shell programming and text processor
- Self-organization is a two-way journey between managers and members
- LeetCode-402 - Remove K digits
- 《DevOps围炉夜话》- Pilot - CNCF开源DevOps项目DevStream简介 - feat. PMC成员胡涛
- QT笔记——用VS + qt 生成dll 和 调用生成的dll
- 测试4年感觉和1、2年时没什么不同?这和应届生有什么区别?
猜你喜欢
HighTec快捷键(Keys)设置位置
边缘与云计算:哪种解决方案更适合您的连接设备?
[Maui official version] Create a cross-platform Maui program, as well as the implementation and demonstration of dependency injection and MVVM two-way binding
【PCBA方案】电子握力测试仪方案she‘ji
异常的了解
黑猫带你学Makefile第13篇:Makefile编译问题合集
【开源教程5】疯壳·开源编队无人机-飞控固件烧写
艺术与科技的狂欢,阿那亚2022砂之盒沉浸艺术季
测试4年感觉和1、2年时没什么不同?这和应届生有什么区别?
IM 即时通讯开发如何设计图片文件的服务端存储架构
随机推荐
port forwarding
QT笔记——vs + qt 创建一个带界面的 dll 和 调用带界面的dll
使用 Cloudreve 搭建私有云盘
shell (text printing tool awk)
LeetCode每日一题(1573. Number of Ways to Split a String)
从斐波那契 - 谈及动态规划 - 优化
[Maui official version] Create a cross-platform Maui program, as well as the implementation and demonstration of dependency injection and MVVM two-way binding
ArcGIS自动随机生成采样点的方法
xshell (sed command)
uni-app微信小程序——下拉多选框
QT笔记——用VS + qt 生成dll 和 调用生成的dll
LeetCode Daily Question (1573. Number of Ways to Split a String)
unusual understanding
xshell (sed 命令)
【PCBA scheme design】Bluetooth skipping scheme
Live Classroom System 08-Tencent Cloud Object Storage and Course Classification Management
财务年报怎样翻译,为什么要选择专业翻译公司?
水果沙拉酱
shell脚本
如何保护 LDAP 目录服务中的用户安全?