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);        
        }    
    }
  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/5342551.html
Copyright © 2011-2022 走看看