您的位置:首页 > 编程语言 > Java开发

丢手帕问题(环形链表)---Java 待优化

2016-03-31 20:09 453 查看
/**
*
* @author Administrator
* 功能:丢手帕问题
*/
package com.litao;

public class Demo4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CycLink cycLink = new CycLink();
cycLink.setLen(5);
cycLink.createLink();
cycLink.setK(2);
cycLink.setM(2);
//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;
//设置m
public void setM(int m)
{
this.m = m;
}
//设置链表的大小
public void setLen(int len)
{
this.len = len;
}
//设置从第几个人开始数数
public void setK(int k)
{
this.k = k;
}
//开始play
public void play()
{
Child temp = this.firstChild;
//1.先找到开始数数的人
for (int i = 1; i < k; i++) {

temp = temp.nextChild;
}

while(this.len > 0)
{
//2.先数m下
for (int j = 1; j < m; j++) {
temp = temp.nextChild;
}
//找到要出圈的前一个小孩
Child temp2 = temp;
while (temp2.nextChild != temp) {
temp2 = temp2.nextChild;
}

//3.将数到m的小孩,退出圈
temp2.nextChild = temp.nextChild;
//让temp指向下一个数数的小孩
temp = temp2.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);
this.firstChild = ch;
this.temp = ch;
}
else if(i >= 2 && i != len){
//继续创建小孩
Child ch = new Child(i);
temp.nextChild = ch;
temp = ch;
}
else if(i == len)
{
Child ch = new Child(i);
temp.nextChild = ch;
temp = ch;
temp.nextChild = firstChild;
}
}
}

//打印该环形链表
public void show()
{
//定义一个跑龙套的
Child temp = this.firstChild;
do{
System.out.println(temp.no+" ");
temp = temp.nextChild;
}while(temp != firstChild);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: