利用单向环形链表解决约瑟夫问题
package List;
public class SingleCircleListDemo {
public static void main(String[] args) {
SingleCircleList list = new SingleCircleList();
list.AddBoys(5);
list.ShowList();
System.out.println(list.GetLinkLength());
list.CountBoy(1,2,5);
}
}
class SingleCircleList{
Boy first = null;
public void AddBoys(int nums){
if (nums < 2){
System.out.println("您输入的数据太少,至少输入两个!");
return;
}
Boy cur = null;
for (int i = 1; i <= nums; i++) {
Boy boy = new Boy(i);
if (i == 1){
first = boy;
first.setNext(boy);
cur = first;
}
else {
cur.setNext(boy);
boy.setNext(first);
cur = boy;
}
}
}
public void ShowList(){
if (first == null){
System.out.println("没有孩子,没有值");
return;
}
Boy cur = first;
while (true){
System.out.printf("孩子的编号为%d\n",cur.getNumber());
if (cur.getNext() == first){
break;
}
cur = cur.getNext();
}
}
public void CountBoy(int startNo,int countNum,int nums){
if (startNo < 1 || startNo > nums || nums < 0 || first == null){
System.out.println("输入的参数不合格");
return;
}
Boy helper = null;
helper = first;
while (helper.getNext() != first){
helper = helper.getNext();
}
for (int i = 0; i < startNo - 1; i++) {
first = first.getNext();
helper = helper.getNext();
}
while (true){
if (helper == first){
break;
}
for (int i = 0; i < countNum - 1; i++) {
first = first.getNext();
helper = helper.getNext();
}
System.out.printf("小孩%d出圈\n",first.getNumber());
first = first.getNext();
helper.setNext(first);
}
System.out.printf("最后留在圈中得为小孩%d\n",first.getNumber());
}
public int GetLinkLength(){
Boy cur = null;
cur = first;
int number = 0;
while (true){
if (cur.getNext() == first){
number++;
break;
}
number++;
cur = cur.getNext();
}
return number;
}
}
class Boy{
private int number;
private Boy next;
public Boy(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Boy getNext() {
return next;
}
public void setNext(Boy next) {
this.next = next;
}
@Override
public String toString() {
return "Boy{" +
"number=" + number +
'}';
}
}