黑马程序员技术交流社区

标题: 丢手绢的算法问题之单链表 [打印本页]

作者: 麦子    时间: 2013-6-12 10:31
标题: 丢手绢的算法问题之单链表
  1. package com.soke.demo5;
  2. /*
  3. * 功能:解决丢手绢问题,采用不带头结点的链表来解决
  4. */
  5. public class PlayHandkerchief {
  6. public static void main(String []args){
  7. CycleLinkList c1 = new CycleLinkList();
  8. c1.setLen(10);
  9. c1.setK(2);
  10. c1.setM(2);
  11. c1.createLinkList();
  12. c1.show();
  13. c1.play();
  14. }
  15. }

  16. //创建一个结点类
  17. class Child{
  18. int no; //结点数据域上的数
  19. Child nextChild=null; //当前结点的下一个结点
  20. public Child(int no){
  21. this.no=no;//初始化给它一个值
  22. }
  23. }

  24. //创建一个单链表类
  25. class CycleLinkList{
  26. Child firstChild=null;//定义一个头结点
  27. Child temp=null;//定义一个跑龙套的结点
  28. int length=0;//单链表的长度,也即是丢手绢问题中人的个数
  29. int k = 0;//从第k个人开始的
  30. int m = 0;//数到第m下,踢走这个人
  31. //设置单链表的大小
  32. public void setLen(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 createLinkList(){
  43. for(int i=1;i<=length;i++){
  44. if(i==1)
  45. {//创建第一个小孩
  46. Child ch = new Child(i);
  47. this.firstChild = ch;//创建了第一个结点的同时,将头结点指向第一个结点
  48. this.temp = ch;//也将跑龙套的结点指向第一个结点
  49. }else{//继续创建新的结点
  50. if(i==length){ //如果是最后一个结点
  51. Child ch = new Child(i);
  52. this.temp.nextChild = ch;//将上一个结点的next结点指向刚创建的新结点
  53. this.temp = ch;//还是将跑龙套的结点指向刚创建的新结点
  54. temp.nextChild = this.firstChild;//将刚创建的新结点的next指针指向firstChild结点
  55. }else{
  56. Child ch = new Child(i);
  57. this.temp.nextChild = ch;//将上一个结点的next结点指向刚创建的新结点
  58. this.temp = ch; //还是将跑龙套的结点指向刚创建的新结点
  59. }
  60. }
  61. }
  62. }
  63. public void play(){//开始玩游戏的方法
  64. temp = this.firstChild;
  65. //先找到开始数数的那个人
  66. for(int i=1;i<k;i++){
  67. temp = temp.nextChild;
  68. }
  69. while(length!=1){
  70. //数m下
  71. for(int j=1;j<m;j++){
  72. temp = temp.nextChild;
  73. System.out.println("当前出局的小孩是:"+temp.no);
  74. }
  75. //如果是单链表的话,问题有点棘手,我怎么要删的结点的上一个结点呢?
  76. //方法就是从要删除的结点开始遍历整个链表,直到找到一个结点它的next结点指向我们删除的结点
  77. Child temp2 = temp;
  78. while(temp2.nextChild!=temp){
  79. temp2 = temp2.nextChild;
  80. }
  81. //将数到m的小孩从链表中删除
  82. temp2.nextChild = temp.nextChild;
  83. //继续要将temp指向下一个结点,不能让链表断了
  84. temp = temp.nextChild;
  85. this.length--;
  86. }
  87. System.out.println("最后出局的小孩是:"+temp.no);
  88. }
  89. public void show(){
  90. //定义一个跑龙套的结点
  91. temp = this.firstChild;
  92. do{
  93. System.out.print(" "+temp.no);
  94. temp = temp.nextChild;
  95. }while(temp!=this.firstChild);
  96. System.out.println();
  97. }
  98. }
复制代码
附上测试结果:
1 2 3 4 5 6 7 8 9 10
当前出局的小孩是:3
当前出局的小孩是:5
当前出局的小孩是:7
当前出局的小孩是:9
当前出局的小孩是:1
当前出局的小孩是:4
当前出局的小孩是:8
当前出局的小孩是:2
当前出局的小孩是:10
最后出局的小孩是:6





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2