【算法通关指南:数据结构和算法篇 】链表相关算法题:3. 队列安排,4.约瑟夫问题

🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南 》
✨ 永远相信美好的事情即将发生

文章目录
前言
本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长
一、队列安排
1.1题目
链接:队列安排

1.2算法原理
频繁的在某一个位置之前和之后插入元素,因此可以用双向循环的链表来模拟。
1.3代码
#include<iostream> using namespace std;constint N =1e5+10;int pre[N];int ne[N];int mp[N];// mp[i] 表⽰ i 这个同学是否已经出队intmain(){int n; cin >> n; ne[0]=1; mp[1]=1;for(int i =2; i <= n; i++){int k, p; cin >> k >> p;if(p ==0){ pre[i]= pre[k]; ne[i]= k; ne[pre[k]]= i; pre[k]= i; mp[i]=1;}elseif(p ==1){ pre[i]= k; ne[i]= ne[k]; pre[ne[k]]= i; ne[k]= i; mp[i]=1;}}int m; cin >> m;for(int i =1; i <= m; i++){int x; cin >> x;if(mp[x]==0)// 如果 x 已经被删除,忽视这条指令 continue; ne[pre[x]]= ne[x]; pre[ne[x]]= pre[x]; mp[x]=0;}for(int i = ne[0]; i; i = ne[i]) cout << i <<" ";return0;}二、约瑟夫问题
2.1题目
链接:约瑟夫问题

2.2算法原理
使用循环链表模拟即可。
2.3代码
#include<iostream> using namespace std;constint N =110;int ne[N];intmain(){int n, m; cin >> n >> m;// 创建循环链表for(int i =1; i < n; i++) ne[i]= i +1; ne[n]=1;// 模拟约瑟夫游戏的过程 int t = n;for(int i =1; i <= n; i++)// 执行n次出圈操作{for(int i =1; i < m; i++)// 让 t 向后移动 m - 1 次 t = ne[t]; cout << ne[t]<<" "; ne[t]= ne[ne[t]];}return0;}总结与每日励志
✨ 摘要: 本文分享了两个链表相关的算法实战题目:《队列安排》和《约瑟夫问题》。 队列安排:通过双向循环链表模拟学生插入和删除操作,使用pre和ne数组维护前驱与后继关系,高效处理动态调整。 约瑟夫问题:利用循环链表模拟游戏过程,每次移动m-1次后删除节点,直至所有节点出圈。 代码简洁高效,适合算法初学者练习链表操作。文末附励志语句,鼓励坚持学习。 关键词:双向链表、循环链表、算法实战、动态模拟
