丢手帕问题(环形链表)---Java 待优化

/**
 * 
 * @author Administrator
 * 功能:丢手帕问题
 */
package com.litao;

public class Demo4 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CycLink cycLink = new CycLink();
        cycLink.setLen(5);
        cycLink.createLink();
        cycLink.setK(2);
        cycLink.setM(2);
        //cycLink.show();
        cycLink.play();
    }
}

//节点
class Child{
    int no;
    Child nextChild = null;
    
    public Child(int no)
    {
        //给一个编号
        this.no = no;
    }
}

//环形链表
class CycLink{
    //先定义一个指向链表第一个小孩的引用
    //指向第一个小孩的引用,不能动
    Child firstChild = null;
    Child temp = null;
    //表示链表的大小,共有几个小孩
    int len = 0;
    int k = 0;
    int m = 0;
    //设置m
    public void setM(int m)
    {
        this.m = m;
    }
    //设置链表的大小
    public void setLen(int len)
    {
        this.len = len;
    }
    //设置从第几个人开始数数
    public void setK(int k)
    {
        this.k = k;
    }
    //开始play
    public void play()
    {
        Child temp = this.firstChild;
        //1.先找到开始数数的人
        for (int i = 1; i < k; i++) {
            
            temp = temp.nextChild;            
        }
        
        while(this.len > 0)
        {
            //2.先数m下
            for (int j = 1; j < m; j++) {
                temp = temp.nextChild;
            }
            //找到要出圈的前一个小孩
            Child temp2 = temp;
            while (temp2.nextChild != temp) {
            temp2 = temp2.nextChild;
            }
        
            //3.将数到m的小孩,退出圈
            temp2.nextChild = temp.nextChild;
            //让temp指向下一个数数的小孩
            temp = temp2.nextChild;            
            this.len--;
        }
        
        //最后一个小孩
        System.out.println("最后出圈:"+temp.no);
        
    }
    //初始化环形链表
    public void createLink()
    {
        for (int i = 1; i <= len; i++) {
            if(i == 1){
                //创建第一个小孩                
                Child ch = new Child(i);
                this.firstChild = ch;
                this.temp = ch;                
            }
            else if(i >= 2 && i != len){
                //继续创建小孩
                Child ch = new Child(i);
                temp.nextChild = ch;
                temp = ch;
            }
            else if(i == len)
            {
                Child ch = new Child(i);
                temp.nextChild = ch;
                temp = ch;
                temp.nextChild = firstChild;
            }
        }
    }
    
    //打印该环形链表
    public void show()
    {
        //定义一个跑龙套的
        Child temp = this.firstChild;
        do{
            System.out.println(temp.no+" ");
            temp = temp.nextChild;
        }while(temp != firstChild);        
    }    
}

 

posted on 2016-03-31 20:09  让编程成为一种习惯  阅读(225)  评论(0编辑  收藏  举报