zoukankan      html  css  js  c++  java
  • 丢手帕问题(环形链表)---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);        
        }    
    }
  • 相关阅读:
    Gson通过借助TypeToken类来解决这个问题
    学习心得
    java反射机制及Method.invoke方法(转载)
    IntentService源码分析
    android中一个app中的activity启动另外一个aar包中的activity
    android 动态加载
    eclispe的快捷键
    android sqlite数据库升级
    [C++] any number to binary (Bit manipulation)
    [C++] Sign and magnitude,Ones' complement and Two's complement
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/5342551.html
Copyright © 2011-2022 走看看