Java数据结构与算法学习记录----Josephu(约瑟夫环)
Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数 到 m的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由 此产生一个出队编号的序列。
思路
创建一个单向的环形链表
先创建第一个节点,让一个指针指向该节点形成环形,之后节点加入已有环形链表
遍历环形链表
利用辅助指针通过while循环
小孩出圈问题:通过输入开始位置,间隔跳出位置,总值。得到最后一个在圈中的小孩。
package linkedlist;
public class Josepfu {
public static void main(String[] args) {
// TODO Auto-generated method stub
CircleSingleLinkedList circleSingleLinkedList=new CircleSingleLinkedList();
circleSingleLinkedList.addBoy(125);
circleSingleLinkedList.showBoy();
circleSingleLinkedList.countBoy(10, 5, 125);
}
}
//创建无头结点的环形单向链表
class CircleSingleLinkedList{
private Boy first=null;
//加入的小孩结点
public void addBoy(int nums) {
if (nums<1) {
System.out.println("NUMS值不合法");
return;
}
Boy curBoy=null;//辅助指针
for (int i=1;i<=nums;i++) {
Boy boy=new Boy(i);
if(i==1) {
first=boy;
first.setNext(first);//构成环
curBoy=first;
}else {
curBoy.setNext(boy);;
boy.setNext(first);
curBoy=boy;
}
}
}
//遍历环形列表
public void showBoy() {
if (first==null) {
System.out.println("无小孩");
return;
}
Boy curBoy=first;
while(true) {
System.out.printf("小孩编号%d\n",curBoy.getOn());
if(curBoy.getNext()==first) {
break;
}
curBoy=curBoy.getNext();//后移
}
}
//根据用户输入,计算出小孩出圈的顺序
/**
*
* @param startBoy开始位置
* @param countNum间隔数
* @param nyms总数
*/
public void countBoy(int startBoy,int countNum,int nyms) {
if (first==null||startBoy<1||startBoy>nyms) {
System.out.println("数据不合法");
return;
}
Boy helper=first;
while(true) {
if (helper.getNext()==first) {
break;
}
helper=helper.getNext();
}
//指针移动到开始小孩处
for(int j=0;j<startBoy-1;j++) {
first=first.getNext();
helper=helper.getNext();
}
//出圈操作,直到只剩一个小孩
while(true) {
if(helper==first) {
System.out.printf("获胜者%d号小孩\n",first.getOn());
break;
}
for(int i=0;i<countNum-1;i++) {
first=first.getNext();
helper=helper.getNext();
}
System.out.printf("小孩%d出圈\n",first.getOn());
first=first.getNext();
helper.setNext(first);
}
}
}
//创建boy类
class Boy{
private int on;
private Boy next;
public Boy(int on) {
this.on=on;
}
public int getOn() {
return on;
}
public void setOn(int on) {
this.on = on;
}
public Boy getNext() {
return next;
}
public void setNext(Boy next) {
this.next = next;
}
}