丢手帕问题(约瑟夫问题)
思路分析:
现在我们来玩一把代码~
package datastructres.linkedlist;
import java.lang.reflect.Field;
/**
* @author :Yan Guang
* @date :Created in 2021/1/10 9:39
* @description:
*/
public class JosephuListDemo {
public static void main(String[] args) {
CircleSingleLinkList circleSingleLinkList = new CircleSingleLinkList();
circleSingleLinkList.add(10);
circleSingleLinkList.list();
}
}
class CircleSingleLinkList {
private Boy first = null;
public void add(int nums) {
if (nums < 1) {
System.out.println("长度过短~");
return;
}
Boy curBoy = null;//辅助指针,当我们使用到辅助指针比如curBoy=first的时候,
// 实际上可以理解为指针指向的这个节点就是节点本身,另外使用到.next或者setNext的时候往往就是指针指向线性的表示,
//当节点为null的时候,无法使用set方法,会异常
for (int i = 1; i <= nums; i++) {
Boy boy = new Boy(i);
if (i == 1) {
first = boy;
first.setNext(boy);
curBoy = first;
} else {
curBoy.setNext(boy);
boy.setNext(first);
curBoy = boy;
}
}
}
public void list() {
if (first == null) {
System.out.println("链表为空~");
return;
}
Boy curBoy = first;
while (true) {
System.out.printf("小孩的编号是:%d\n", curBoy.getNo());
//这里if一定要放在这里,不然的话,打印不了最后一个小孩~
if (first == curBoy.getNext()) {
break;
}
curBoy = curBoy.getNext();
}
}
}
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;
}
}
当这些代码写完之后,现在我们开始写出圈的代码了,先给大家看看思路~
下面是代码实操~
/**
* @param startNo 表示开始的编号
* @param countNum 表示数几次
* @param nums 表示小孩的个数
*/
public void outByOrder(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();
}
for (int i=1;i<startNo;i++){
first=first.getNext();
helper=helper.getNext();
}
while (true){
if (first==helper){
break;
}
for (int i=1;i<countNum;i++){
first=first.getNext();
helper=helper.getNext();
}
System.out.printf("%d小孩出圈~\n",first.getNo());
first=first.getNext();
helper.setNext(first);
}
System.out.printf("最后留在圈中的小孩编号是%d~",first.getNo());
}
搞完收工,欢迎大家在评论区讨论~