当前位置:网站首页>链表应用----约瑟夫问题
链表应用----约瑟夫问题
2022-08-10 19:06:00 【幼儿园里的山大王】
一、题目
二、思路分析
可以看做是两步:创建环形链表和出圈
三、代码实现
public class Josepfu {
public static void main(String[] args) {
CircleSingleLinkedList list = new CircleSingleLinkedList();
list.add(5);
// list.show();
list.countBoy(1,2,5);
}
}
class CircleSingleLinkedList{
// 创建一个first节点,当前没有编号
private Boy first = null;
public void add(int nums){
if (nums < 0){
throw new RuntimeException("输入有误");
}
Boy temp = null;
for (int i=1;i<=nums;i++){
Boy boy = new Boy(i);
if (i == 1){
first = boy;
first.setNext(first);
temp=first;
}else{
temp.setNext(boy);
temp = boy;
boy.setNext(first);
}
}
}
public void show(){
if (Objects.isNull(first)){
throw new RuntimeException("连表为空");
}
Boy boy = first;
while (true){
System.out.println("小孩"+boy.getNo());
if (boy.getNext() == first){
break;
}
boy = boy.getNext();
}
}
public void countBoy(int start,int count,int nums){
if (start <1 || Objects.isNull(first) || start>nums){
throw new RuntimeException("输入有误");
}
// 1.创建一个辅助指针
Boy help = first;
// 2.让help 指向最后一个节点
while (true){
if (help.getNext() == first){
break;
}
help = help.getNext();
}
// 3.小孩报数前让first与help 节点向前移动start -1个位置,如果start 为1的话就不用移动,原因在于first本来就在第一位,而help本来就在最后以为
// help一直都是在first的后一位
for (int i =0;i<start-1;i++){
first=first.getNext();
help = help.getNext();
}
// 4.出圈
while (true){
// 4.1 help一直都是在first后面,当help等于first时,说明只有一个节点
if (help == first){
break;
}
/** 4.2 将两个指针移到指定位置;比如说:原本first是在第一个节点,help是在first后面,也就是最后一个节点。
现在要从第二个节点开始。那么first和help就要往前移动一位;
*/
for (int j = 0;j<count-1;j++){
first = first.getNext();
help = help.getNext();
}
System.out.println("出圈小孩"+first.getNo());
// 4.3 此时的first是要出圈的节点,所以这个时候呀first指针要下移一位。
first =first.getNext();
// 4.4 然后help连接first,也就是出圈节点的下一位。这个时候出圈节点就没有指针和连接指向他了,垃圾回收器就回对他进行回收
help.setNext(first);
}
// 5.打印最后一个节点
System.out.println("最后一个小孩"+first.getNo());
}
}
class Boy{
private int no;
private Boy next;
public Boy(int no) {
this.no = no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public Boy getNext() {
return next;
}
public void setNext(Boy next) {
this.next = next;
}
}
边栏推荐
- 2022杭电多校七 Black Magic (签到)
- 线性结构----链表
- opengrok搭建[通俗易懂]
- CAS:190598-55-1_Biotin sulfo-N-hydroxysuccinimide ester生物素化试
- 代理模式的使用总结
- 电脑重装系统Win11格式化硬盘的详细方法
- 杭电多校七 1003-Counting Stickmen(组合数学)
- whois information collection & corporate filing information
- 怎么完全卸载赛门铁克_Symantec卸载方法,赛门铁克卸载「建议收藏」
- 转铁蛋白(TF)修饰紫杉醇(PTX)脂质体(TF-PTX-LP)|转铁蛋白(Tf)修饰姜黄素脂质体
猜你喜欢
七月券商金工精选
ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path
3D Game Modeling Learning Route
“2022零信任神兽方阵”启动调研,欢迎各单位填报信息
魔方电池如何“躺赢”?解锁荣威iMAX8 EV“头等舱”安全密码
转铁蛋白Tf功能化β-榄香烯-雷公藤红素/紫杉醇PLGA纳米粒/雷公藤甲素脂质体(化学试剂)
苹果字体查找
YOLOv3 SPP源码分析
[Teach you how to make a small game] Write a function with only a few lines of native JS to play sound effects, play BGM, and switch BGM
【深度学习前沿应用】图像风格迁移
随机推荐
ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path
【二叉树】二叉搜索树的后序遍历序列
3D游戏建模学习路线
水溶性合金量子点纳米酶|CuMoS纳米酶|多孔硅基Pt(Au)纳米酶|[email protected]纳米模拟酶|PtCo合金纳米粒子
巧用RoaringBitMap处理海量数据内存diff问题
[教你做小游戏] 斗地主的手牌,如何布局?看25万粉游戏区UP主怎么说
【初学必备】3d游戏建模入门基础知识
mysql----group by、where以及聚合函数需要注意事项
Optimization is a habit The starting point is to 'stand close to the critical'
The servlet mapping path matching resolution
大家要的Biotin-PEG3-Br/acid/NHS ester/alcohol/amine合集分享
铁蛋白颗粒负载雷替曲塞/培美曲塞/磺胺地索辛/金刚烷(科研试剂)
杭电多校七 1003-Counting Stickmen(组合数学)
3D Game Modeling Learning Route
电脑开不了机是什么原因?
含有PEG 间隔基和一个末端伯胺基团(CAS:1006592-62-6)化学试剂
陕西CAS:1244028-50-9_Biotin-PEG3-SCO-PPh3 固体
TDD、FDD是什么意思?
Biotin-PEG4-IC(TFP ester/amine/NHS Ester/azide)特性分享
Keras深度学习实战(17)——使用U-Net架构进行图像分割