1+ package com .cpucode .linked .list ;
2+
3+ /**
4+ * @author : cpucode
5+ * @date : 2021/3/13
6+ * @time : 10:37
7+ * @github : https://github.com/CPU-Code
8+ * @csdn : https://blog.csdn.net/qq_44226094
9+ */
10+ public class Josephu {
11+ public static void main (String [] args ) {
12+
13+ }
14+ }
15+
16+ /**
17+ * 创建一个环形的单向链表
18+ */
19+ class CircleSingleLinkedList {
20+ /**
21+ * 创建一个first节点,当前没有编号
22+ */
23+ private Boy first = null ;
24+
25+
26+ /**
27+ * 添加小孩节点,构建成一个环形的链表
28+ * @param nums
29+ */
30+ public void addBoy (int nums ){
31+ // nums 做一个数据校验
32+ if (nums < 1 ){
33+ System .out .println ("nums的值不正确" );
34+
35+ return ;
36+ }
37+
38+ // 辅助指针,帮助构建环形链表
39+ Boy curBoy = null ;
40+
41+ // 使用for来创建我们的环形链表
42+ for (int i = 1 ; i < nums ; i ++) {
43+ // 根据编号,创建小孩节点
44+ Boy boy = new Boy (i );
45+
46+ // 如果是第一个小孩
47+ if (i == 1 ){
48+ first = boy ;
49+ // 构成环
50+ first .setNext (first );
51+ // 让curBoy指向第一个小孩
52+ curBoy = first ;
53+ }else {
54+ curBoy .setNext (boy );
55+ boy .setNext (first );
56+ curBoy = boy ;
57+ }
58+ }
59+ }
60+
61+
62+ /**
63+ * 遍历当前的环形链表
64+ */
65+ public void showBoy (){
66+ // 如果是第一个小孩
67+ if (first == null ){
68+ System .out .println ("没有任何小孩~~" );
69+
70+ return ;
71+ }
72+
73+ // 因为first不能动,因此我们仍然使用一个辅助指针完成遍历
74+ Boy curBoy = first ;
75+
76+ while (true ){
77+ System .out .printf ("小孩的编号 %d \\ n" , curBoy .getNo ());
78+
79+ // 说明已经遍历完毕
80+ if (curBoy .getNext () == first ){
81+ break ;
82+ }
83+
84+ // curBoy后移
85+ curBoy = curBoy .getNext ();
86+ }
87+ }
88+
89+
90+ /**
91+ * 根据用户的输入,计算出小孩出圈的顺序
92+ * @param starNo 表示从第几个小孩开始数数
93+ * @param countNum 表示数几下
94+ * @param nums 表示最初有多少小孩在圈中
95+ */
96+ public void countBoy (int starNo , int countNum , int nums ){
97+ // 先对数据进行校验
98+ if (first == null || starNo < 1 || starNo > nums ){
99+ System .out .println ("参数输入有误, 请重新输入" );
100+
101+ return ;
102+ }
103+ // 创建要给辅助指针,帮助完成小孩出圈
104+ Boy helper = first ;
105+
106+ // 需求创建一个辅助指针(变量) helper , 事先应该指向环形链表的最后这个节点
107+ while (true ){
108+ if (helper .getNext () == first ){
109+ break ;
110+ }
111+ }
112+
113+ }
114+ }
115+
116+ /**
117+ * 创建一个Boy类,表示一个节点
118+ */
119+ class Boy {
120+ /**
121+ * 编号
122+ */
123+ private int no ;
124+ /**
125+ * 指向下一个节点,默认null
126+ */
127+ private Boy next ;
128+
129+ public Boy (int no ){
130+ this .no = no ;
131+ }
132+
133+ public int getNo () {
134+ return no ;
135+ }
136+
137+ public void setNo (int no ) {
138+ this .no = no ;
139+ }
140+
141+ public Boy getNext () {
142+ return next ;
143+ }
144+
145+ public void setNext (Boy next ) {
146+ this .next = next ;
147+ }
148+
149+
150+ @ Override
151+ public String toString () {
152+ return "Boy{" +
153+ "no=" + no +
154+ '}' ;
155+ }
156+ }
0 commit comments