【数据结构与算法 5】环形链表解决约瑟夫问题

1、构建一个单向的环形链表思路:

  • 先创建第一个节点,让first指向该节点,并形成环形

  • 后面我们没创建一个新节点,就把当前节点加入到已有的环形链表中即可

2、遍历环形链表:

  • 先让一个辅助指针(遍历)curBoy,指向first节点

  • 然后通过一个while循环遍历该环形链表即可 curBoy.next =  first 结束

四、小孩出圈问题分析


五、代码实现


1、实体类

package com.guor.linkedlist.josepfu;

public 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;

}

}

2、环形链表方法类

package com.guor.linkedlist.josepfu;

public class CircleSingleLinkedList {

//创建一个first节点,当前没有编号

private Boy first = null;

//添加小孩节点,构建一个环形链表

public void addBoy(int nums){

//nums做一个数据校验

if(nums<1){

System.out.println(“nums的值不正确。”);

return;

}

//辅助指针,构建环形链表

Boy curBoy = null;

//使用for循环来创建环形链表

for(int i = 1;i<= nums;i++){

//根据编号创建小孩节点

Boy boy = new Boy(i);

//第一个小孩比较特别

if(i==1){

first = boy;

first.setNext(first);//构成一个环

curBoy = first;//让curboy指向第一个小孩

}else{

curBoy.setNext(boy);

boy.setNext(first);

curBoy = boy;

}

}

}

public void showBoy(){

//链表是否为空

if(first == null){

System.out.println(“链表为空”);

return;

}

//因为first不能动,所以使用一个辅助指针完成遍历

Boy curBoy = first;

while(true){

System.out.printf(“小孩的编号 %d \n”,curBoy.getNo());

if(curBoy.getNext() == first){

break;

}

curBoy = curBoy.getNext();

}

}

//根据用户的输入,计算出小孩出圈的顺序

public void countBoy(int startNo,int countNum,int nums){

//校验

if(first == null || startNo<1 || startNo>nums){

System.out.println(“参数输入有误,请重新输入”);

return;

}

//创建辅助指针,帮助完成小孩出圈

Boy helper = first;

while (true){

if(helper.getNext() == first){

break;

}

helper = helper.getNext();

}

//加入startNo不是1,先让first和helper移动k-1次

for (int i = 0; i < startNo - 1; i++) {

first = first.getNext();

helper = helper.getNext();

}

//当小孩报数之前,让first和helper指针同时移动countNum次,然后出圈

//这里是一个循环的操作,直到圈中只有一个节点

while(true){

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

技术类文章以及学习类文章!**(阿里对MySQL底层实现以及索引实现问的很多)

[外链图片转存中…(img-Kt2myapR-1721165033934)]

[外链图片转存中…(img-FSWFq2wm-1721165033935)]

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值