面对对象的出圈问题

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);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值