A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 麦子 中级黑马   /  2013-6-12 10:34  /  2155 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.soke.demo6;

  2. public class PlayHandkerchief {

  3. /**
  4. * 功能:解决丢手绢问题,采用不带头结点的双链表来解决
  5. */
  6. public static void main(String[] args) {
  7. DLinkList c1 = new DLinkList();
  8. c1.setLength(10);
  9. c1.setK(2);
  10. c1.setM(2);
  11. c1.createDLinkList();
  12. c1.show();
  13. c1.play();

  14. }
  15. }
  16. //创建一个结点类
  17. class Child{
  18. int no;//结点数据域上的数
  19. Child priorChild;//当前结点的前一个结点
  20. Child nextChild;//当前结点的下一个结点
  21. public Child(int no){
  22. this.no = no;
  23. }
  24. }
  25. //创建一个双链表类
  26. class DLinkList{
  27. Child firstChild = null;//定义一个头结点
  28. Child temp = null;//定义一个跑龙套的结点
  29. int length = 0 ; //定义双链表的长度
  30. int k = 0;//从第K个人开始游戏的
  31. int m = 0;//数到第m个数的人就退出游戏
  32. public void setLength(int length) {
  33. this.length = length;
  34. }
  35. public void setK(int k) {
  36. this.k = k;
  37. }
  38. public void setM(int m) {
  39. this.m = m;
  40. }
  41. //初始化双链表
  42. public void createDLinkList(){
  43. for(int i=1;i<=length;i++){
  44. if(i==1){//表示创建第一个结点
  45. Child ch = new Child(i);
  46. this.firstChild=ch;//创建了第一个结点的同时,将头结点指向第一个结点
  47. this.temp=ch;//也将跑龙套的结点指向第一个结点
  48. }else{//继续创建新的结点
  49. if(i==length){//表示创建的是尾结点
  50. Child ch = new Child(i);
  51. temp.nextChild=ch;
  52. temp.nextChild.priorChild=temp;
  53. temp=ch;
  54. temp.nextChild=this.firstChild;
  55. this.firstChild.priorChild=temp;
  56. }else{
  57. Child ch = new Child(i);
  58. temp.nextChild=ch;
  59. temp.nextChild.priorChild=temp;
  60. temp=ch;
  61. }
  62. }
  63. }
  64. }
  65. public void play(){//开始玩游戏
  66. temp = this.firstChild;
  67. //先找到开始数数的那个人
  68. for(int i=1;i<k;i++){
  69. temp=temp.nextChild;
  70. }
  71. while(length!=1){
  72. //数m下
  73. for(int j=1;j<m;j++){
  74. temp=temp.nextChild;
  75. }
  76. System.out.println("当前出局的小孩是:"+temp.no);
  77. temp.priorChild.nextChild=temp.nextChild;
  78. temp.nextChild.priorChild=temp.priorChild;
  79. temp=temp.nextChild;
  80. this.length--;
  81. }
  82. System.out.println("最后出局的小孩是:"+temp.no);
  83. }
  84. public void show(){
  85. //定义一个跑龙套的结点
  86. temp = this.firstChild;
  87. do{
  88. System.out.print(" "+temp.no);
  89. temp = temp.nextChild;
  90. }while(temp!=this.firstChild);
  91. System.out.println();
  92. }
  93. }
复制代码
附上测试结果:
1 2 3 4 5 6 7 8 9 10
当前出局的小孩是:3
当前出局的小孩是:5
当前出局的小孩是:7
当前出局的小孩是:9
当前出局的小孩是:1
当前出局的小孩是:4
当前出局的小孩是:8
当前出局的小孩是:2
当前出局的小孩是:10
最后出局的小孩是:6

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

6 个回复

正序浏览
package MyPro;

public class Shoupa
{

        /**
         * @param args
         */
        public static void main(String[] args)
        {
                // TODO Auto-generated method stub
  CycLink cyclink=new CycLink();
  cyclink.setLen(6);
  cyclink.createLink();
  cyclink.setK(4);
  cyclink.setM(3);
  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;
       
        //设置链表大小
        public void  setLen(int len)
        {
                this.len=len;
        }
       
        //设置第k人开始数数
        public void setK(int k)
        {
                this.k=k;
        }
       
        //设置数m下
        public void setM(int m)
        {
        this.m=m;
        }
       
        //初始化环形链表
        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==len)
                                {
                                        Child ch=new Child(i);
                                        temp.nextChild=ch;
                                        temp=ch;
                                        temp.nextChild=this.firstChild;
                                }
                                else
                                {
                                        Child ch=new Child(i);
                                        temp.nextChild=ch;
                                        temp=ch;
                                }
                        }
                }
        }       


//打印该环形链表

        public void show()

        {
        Child temp=this.firstChild;
        System.out.print("当前做游戏的小孩子是:");
        do
        {
                System.out.print(temp.no+"   ");
                temp=temp.nextChild;
        }while(temp!=this.firstChild);
        System.out.println();
    }
       
        //执行游戏
        public void play()
        {
                //招开始数数的人
                Child temp=this.firstChild;
                Child temp2=this.firstChild;//用来找到出圈的前一个小孩
                for(int i=1;i<k;i++)
                {
                        temp=temp.nextChild;
                }
                while(this.len!=1)
                {
                        //数m下
                        for(int j=1;j<m;j++)
                        {  if(j!=m-1)
                           {temp=temp.nextChild;}
                           else
                           {
                            temp2=temp;//出圈的前一个 小孩
                            temp=temp.nextChild;
                           }          
                        }
                        temp2.nextChild=temp.nextChild;//第m个小孩退出圈
                        temp=temp.nextChild;
                        this.len--;
                }
                System.out.println("最后剩下的那个孩子是:"+temp.no);
        }
}
回复 使用道具 举报
韩顺平老师java基础视频里面有,不过不是用的双向链表
回复 使用道具 举报
孙百鑫 发表于 2013-6-12 11:59
楼主应该写一下需求更好啦就好啦

就是小朋友玩得丢手绢问题,用程序来模拟这个过程
回复 使用道具 举报
楼主应该写一下需求更好啦就好啦
回复 使用道具 举报
其实不懂丢手绢游戏是怎么玩的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马