1 /*
2 * 作者:zhaop
3 * 功能:约瑟夫环
4 *
5 */
6 public class Joseph {
7 public static void main(String[] args) {
8 // TODO Auto-generated method stub
9 CyLink link =
new CyLink();
10 link.setLen(5
);
11 link.setK(2
);
12 link.setM(2
);
13 link.createLink();
14 link.show();
15 link.play();
16 }
17 }
18 class Child
19 {
20 int no;
// 人的编号
21 Child nextChild =
null;
// 指向下一个
22 public Child(
int no)
23 {
24 this.no =
no;
25 }
26 }
27 class CyLink
28 {
29 Child firstChild =
null;
// 头指针
30 Child currentChild =
null;
// 当前指针
31 int len = 0;
// 总人数
32 int k = 0;
// 从第k个人开始数数
33 int m = 0;
// 数m个数
34 public void setLen(
int len)
35 {
36 this.len =
len;
37 }
38 // 设置k
39 public void setK (
int k)
40 {
41 this.k =
k;
42 }
43 public void setM (
int m)
44 {
45 this.m =
m;
46 }
47 //初始化环形链表
48 public void createLink()
49 {
50 for (
int i = 1; i <= len; i++
)
51 {
52 Child ch =
new Child(i);
53 if (i == 1)
// 第一个时,修改头指针
54 {
55 firstChild = currentChild =
ch;
56 }
57 else
58 {
59 if (i == len)
// 最后一人的 下一个指针指向 第一个人
60 {
61 currentChild.nextChild =
ch;
62 ch.nextChild =
firstChild;
63 currentChild =
ch;
64 }
65 else
66 {
// 对其他的人来说,让新创建的对象 放在 当前对象的下一个位置,并让当前对象指向新创建的对象
67 currentChild.nextChild =
ch;
68 currentChild =
ch;
69 }
70 }
71 }
72 }
73 //开始游戏
74 public void play()
75 {
76 Child temp =
firstChild;
77 //1.先开始找到数数的人
78 for (
int i = 1; i < k; i++
)
79 {
80 temp =
temp.nextChild;
81 }
82 //2.数m下
83 while (len != 1
)
84 {
85 //为了便于修改指针,可以数 m - 1下
86 for (
int i = 1; i < m - 1; i++
)
87 {
88 temp =
temp.nextChild;
89 }
90
91 //3.将数到m的小孩弄出圈去
92 // 此时temp是数m-1后的结果,所以要修改temp的下一个指针的
93 temp.nextChild =
temp.nextChild.nextChild;
94 temp =
temp.nextChild;
95 len--
;
96 }
97 System.out.println("最后一个小孩是:" +
temp.no);
98 }
99 // 打印该环形链表
100 public void show()
101 {
102 Child temp =
firstChild;
103 do {
104 System.out.println(temp.no);
105 temp =
temp.nextChild;
106 }
while (temp !=
firstChild);
107 }
108 }
View Code
转载于:https://www.cnblogs.com/zhaopAC/p/6289995.html
相关资源:JAVA上百实例源码以及开源项目