public class Demo
{
public static void main(String[] args)
{
CyLink cyLink = new CyLink();
cyLink.setlen(5);
cyLink.setK(2);
cyLink.setM(2);
cyLink.CreateLink();
// 打印创建的环链接的样式
// cyLink.show();
cyLink.play();
}
}
class Child
{
int no;
Child nextchild = null;
Child indexChild = null;
public Child(int no)
{
this.no = no;
}
}
class CyLink
{
Child firstchild = null;
Child temp = null;
int len;
int k = 0;
int M = 0;
public void setlen(int len)
{
this.len = len;
}
public void setK(int k)
{
this.k = k;
}
public void setM(int m)
{
this.M = m;
}
public void play()
{
Child temp = this.firstchild;
while (len != 1)
{
for (int i = 1; i < k; i++)
{
temp = temp.nextchild;
}
for (int j = 1; j < M; j++)
{
temp = temp.nextchild;
}
// 当前小孩的上个小孩的下个小孩指向当前小孩的下个小孩(让上一个小孩的nextchild指向当前小孩的nextchild)
temp.indexChild.nextchild = temp.nextchild;
// 当前小孩的下个小孩的上个小孩指向当前小孩的上个小孩(让下一个小孩的indexChild指向当前小孩的indexChild)
temp.nextchild.indexChild = temp.indexChild;
temp = temp.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);
temp = ch;
firstchild = ch;
} else
{
Child ch = new Child(i);
// 创建最后一个小孩
if (i == len)
{
// 保存当前temp
Child index = temp;
// 当前temp的下一个小孩是刚创建的小孩
temp.nextchild = ch;
// 刚创建的小孩赋给temp
temp = ch;
// 刚创建的小孩的上一个小孩是index
temp.indexChild = index;
// 刚创建的小孩的上一个小孩是第一个小孩
temp.nextchild = firstchild;
// 第一个小孩的上一个小孩是最后创建的小孩
firstchild.indexChild = ch;
}
// 创建其他小孩
else
{
// 保存当前temp
Child index = temp;
// 当前temp的下一个小孩是刚创建的小孩
temp.nextchild = ch;
// 刚创建的小孩赋给temp
temp = ch;
// 刚创建的小孩的上一个小孩是index
temp.indexChild = index;
}
}
}
}
public void show()
{
Child temp = this.firstchild;
do
{
System.out.println(temp.no + "前:" + temp.indexChild.no + "后:" + temp.nextchild.no);
temp = temp.nextchild;
} while (temp != this.firstchild);
}
}