Person
public class Person {
int id; //人的编号
Person left; //人的右边
Person right; //人的左边
}
主类 出圈
public class Circle {
int times; //次数
int count = 0; // 统计的总人数
Person first; //圈中第一人
Person last; //圈中最后一个
static int idNum = 0; //设置一个动态的变量来给每一个人赋值
static int x = 0;
//构造函数 我们创建一个圈
Circle(int n)
{
x = n;
//创建n个人物
for(int i = 0; i < n; i ++)
{
//首先创建一个临时的人物
Person temp = new Person();
//每一个人都给一个id 从 1 ,2,3,...
temp.id = ++idNum;
//都添加一个人物进去
add(temp);
//总人数++
count++;
}
System.out.println("-------人物添加完成-------");
System.out.println();
}
//圈中添加人
void add(Person p)
{
/*
* 如果圈中没人
*/
if(count == 0)
{
//第一个人和最后一个人都是本身
first = p;
last = p;
//且 它左右边没人 即为空
p.left = null;
p.right = null;
System.out.println("--------当前圈中无人--------");
System.out.println("第一个人是 "+first.id+" 最后一个人是"+ last.id);
System.out.println();
System.out.println("添加成功 当前人物id为: "+p.id);
System.out.println();
System.out.println("--------当前圈中有人--------");
}
/*
* 如果圈中有人 人数至少为1
*/
if(count > 0)
{
//如果这是最后一个人的话
if(p.id == x )
{
//首先进来的人先牵住最后一个人
p.left = last;
//最后一个人的右手牵住当前人
last.right = p;
last = p;
//它的右边为圈的起始第一人
p.right = first;
//第一个人牵住最后一个人的手
first.left = p;
}
else
{
//首先进来的人先牵住最后一个人
p.left = last;
//最后一个人的右手牵住当前人
last.right = p;
//添加成功之后
last = p;
}
System.out.println("添加成功 当前人物id为: "+p.id);
}
}
//删除圈中的当前的人
void del(Person p)
{
//它的 左边的人的右边人 = 它的右边
p.left.right = p.right;
//它的 右边的人的左边人 = 它的左边
p.right.left = p.left;
//如果删除的时候 删除的正好是first 或者last的话
if( p == first)
{
first = p.right;
}
else if( p == last)
{
last = p.left;
}
//提示出圈人的id信息
System.out.println(" 出圈的人是:"+p.id+"\n");
}
//报道m的人出圈
public void result(int m)
{
System.out.println("-------报数出圈-------");
int num = 0;
Person p = first;
//这是去测验退出的人物
int times = 0;
while(times < x - 1)
{
/*
* 在 一圈的人当中
* 退出的条件就是 p 是 最后一个人
*/
for(;p != last;p = p.right)
{
if(num == m - 1)
{
System.out.print("第"+(times+1)+"个");
del(p);
num = 0;
times++;
}
else num++;
}
// ------------
if(p == last)
{
//而且for循环过后 p是正好报数的人
if(num==m-1)
{
System.out.print("第"+(times+1)+"个");
//删除这个人
del(p);
//删除了这个人后 向右边移动一个
p = p.right;
//重新报数
num = 0;
//人物减少
times++;
}
/*
* 如果P是最后一个人 但不是要报数的人
* 我们就把P移动
*/
else
{
num++;
p = p.right;
}
}
else //如果这个人物是最后一个 但是不符合条件的话
{
num++;
p = p.right;
}
}
System.out.println("最后一个出圈的人是:"+last.id);
}
public static void main(String[] args) {
//首先我们创建一个圈 里面有8个人
//构造函数里面已经添加了人
// 6个人 显示 364251
// 7个人 显示 3627514
// 8个人 显示 36152847
Circle c = new Circle(8);
c.result(3);
}
}