数3退1

擦,这个程序弄死我了。。。。。各种出小错误,嗨。。。

/**
 * 
 * @author 
 *    面向对象分析思路:
 *        对象    
 *        人
 *            特有属性
 *            编号:一旦拉成圈,就一定会有各自的编号,即使退出了,编号还是唯一的
 *            左边的人:一旦拉成圈,左边会有人,虽然在变化
 *            右边的人:同上
 *        圈
 *            特有属性
 *            圈里的人数
 *            开头和末尾的人:1.不管多少人拉圈,唯独开头和末尾的人是固定的,这是属性
 *                            2.考虑到拉圈的方法,我要拉圈,必须把人加进去
 *                            我这里加人就是考虑开头和末尾的人
 *                            新人的左边拉着开头的人,右边拉着末尾的人
 *                            然后新人就变成最后一个人,即末尾
 *                            以此,以后加人就这样加
 *                            3.删除,假设要删人,被删人的左边就拉着被删人的右边
 *                            被删人的右边就拉着被删人的左边
 *            构造方法
 *            形参传人数:搭建多少人的圈
 *            特有方法
 *            拉圈:让人拉成圈
 *            删人:看上面
 *            数数:数3删1
 */

class Person{
    //每人的ID
     private int id;
    //他左边的人
     Person leftPerson;
    //他右边的人
     Person rightPerson;
    //这次我不考虑带参构造,因为用起来麻烦
    Person(){}

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Person getLeftPerson() {
        return leftPerson;
    }

    public void setLeftPerson(Person leftPerson) {
        this.leftPerson = leftPerson;
    }

    public Person getRightPerson() {
        return rightPerson;
    }

    public void setRightPerson(Person rightPerson) {
        this.rightPerson = rightPerson;
    }
}

class Circle{
    //圈里的人数
    private int number;
    //开头的人
    private Person firstPerson;
    //末尾的人
    private Person lastPerson;
    
    //本次构造就是字面意思,设定多少人的圈
    Circle(int number){
        for(int i=0;i<number;i++){
            MarkCircle();
        }
    }
    
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public Person getFirstPerson() {
        return firstPerson;
    }

    public void setFirstPerson(Person firstPerson) {
        this.firstPerson = firstPerson;
    }

    public Person getLastPerson() {
        return lastPerson;
    }

    public void setLastPerson(Person lastPerson) {
        this.lastPerson = lastPerson;
    }

    //造圈的方法,就是添人,加在开头的左边,末尾的右边,然后新人就变成最后一个人
    public void MarkCircle(){        
        //先造一个人
        Person p = new Person();
        //设置id
        p.setId(number);        
        //判断圈里人数,如果只有1个人
        if(number<=0){
            //开头末尾都是一个人
            firstPerson = p;        
            lastPerson = p;        
            //此人的左右都是此人
            p.setLeftPerson(p);
            p.setRightPerson(p);    
        }else{
            //末尾的右边是新人
            lastPerson.setRightPerson(p);
            //新人的左边是末尾
            p.setLeftPerson(lastPerson);
            //开头的左边是新人
            firstPerson.setLeftPerson(p);
            //新人的右边是开头
            p.setRightPerson(firstPerson);    
            //最后一个人变成新人
            lastPerson = p;
        }
        number++;
    }
    
    //删人,实质类似像消除该人的引用,最后这个被消除的人的引用指向了他右边的人
    public void Quit(Person p){
        //都没人,无意义
        if(number<=0){
            return;        
        }else if(number == 1){
            //只有一个人了,就是此人,把开头和末尾的人的引用变空
            firstPerson=lastPerson=null;
        }
        else{
            //删一个人,就是添人的逆向,被删除人左边的人拉着被删除人右边的人
            p.getLeftPerson().setRightPerson(p.getRightPerson());
            //被删除人右边的人拉着被删除人左边的人
            p.getRightPerson().setLeftPerson(p.getLeftPerson());
            //判断是不是删到头未了
            if(p==firstPerson){
                firstPerson=p.getRightPerson();
                }
            else if(p==lastPerson){
                lastPerson=p.getLeftPerson();
            }
        }
        number--;
    }
    
    public void Count3Quit1(){
        //先从第一个人开始数
        Person p = firstPerson;
        //计数
        int countnum=0;
        //只要圈里面有1个以上的人
        while(number>1){
            countnum++;
            //数3退1
            if(countnum==3){
                //清零
                countnum=0;
                //删人
                Quit(p);
            }
        //该人已被删除,从它右边的人开始数
        p=p.getRightPerson();
        }
        //打印留下的人,第一个和最后一个都一样
        System.out.println(firstPerson.getId());
    }
}
public class Count3Quit1 {
    public static void main(String []args){
        Circle c = new Circle(500);
        c.Count3Quit1();
    }

}

年代已久,这段小程序真心弄的辛苦。。。嗨

你可能感兴趣的:(数3退1)