/
// 作者:67 //
// 时间:2016.7.29 //
// 目的:掌握链表,另一种方法代替Josephu问题中查找需要的删除的节点部分 //
///
import java.util.Scanner;
public class Jo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入参加的活动的学生个数:");
Scanner ss=new Scanner(System.in);
int s=ss.nextInt();
System.out.println("请输入从第几位学生开始数:");
Scanner dd=new Scanner(System.in);
int d=dd.nextInt();
System.out.println("请输入需要数的学生个数:");
Scanner ff=new Scanner(System.in);
int f=ff.nextInt();
Lianbiao b=new Lianbiao(s);
b.lianjie();
b.begin(3);
b.much(5);
}
}
//孩子类公共属性
class Child
{
int number; //第几个小孩
Child nextchild=null; //下一个小孩
public Child(intnumber)
{
this.number=number;
}
}
//形成链表
class Lianbiao
{
//首链表
Child firstchild=null;
//下一个链表
Child temp=null;
//几位小孩子
int len=0;
Child temp2=null;
public Lianbiao(int len)
{
this.len=len;
}
//环形链表
public void lianjie()
{
for(int i=1;i<=len;i++)
{
Child a=new Child(i);//给孩子编号
if(i==1) //为第一个时
{
firstchild=a;
temp=a;
}
else if(1
{
temp.nextchild=a;
temp=a;
}
else if(i==len)//最后一个
{
temp.nextchild=a;
temp=a;
temp.nextchild=firstchild;
}
System.out.print(" "+temp.number);//输出链表
}
System.out.println(" ");
}
//第几个开始数
public void begin(int m)
{
temp=firstchild;
for(int i=1;i
{
temp=temp.nextchild;
}
System.out.print("从第"+temp.number+"位小孩子开始数");
}
//数几个
public void much(int n)
{
System.out.println(n+"位小朋友");
do{
for(int i=1;i
{
if(i==n-2) //前一位
{
temp=temp.nextchild;
temp2=temp;
}
else{
temp=temp.nextchild; //本身需要删除的节点
}
}System.out.println("结果为:编号为"+temp.number+"的小朋友out。");
//删除
temp2.nextchild=temp.nextchild;
temp=temp.nextchild;
len--;
}while(len!=1);
System.out.println("最后胜利者为"+temp.number);
}
}
总结:学习时看到老师是用循环查找的方式找到需要删除的节点的前一位,如果数据大会影响运行速度,所以我用直接用“替身”保留上一位的方式代替。