[2016/7/29]JAVA之关于约瑟夫问题




/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//     作者: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);
}
}

总结:学习时看到老师是用循环查找的方式找到需要删除的节点的前一位,如果数据大会影响运行速度,所以我用直接用“替身”保留上一位的方式代替。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章