解决方案 »

  1.   

    不调用show函数的时候,运行报错Exception in thread "main" java.lang.NullPointerException
    at zicheng.CycLink.play(Josephu.java:65)
    at zicheng.Josephu.main(Josephu.java:15)65行是
    //2.数m下
    for(int j=1;j<m;j++)
    {
    temp =temp.nextChild;
    }
    其中temp= temp.nextChild;是第六十五行,是这一句这就没有赋值成功吗?
      

  2.   

    试下在main()后面加上 throws Exception试试!
      

  3.   

     package zicheng;public class Josephu { public static void main(String[] args)
    {

    CycLink cyclink = new CycLink();
    cyclink.setLen(8);
    cyclink.creatLink();
    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;

    //设置链表的大小
    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()
    {
    //1.知道开始数数的人
    for(int i=1;i<k;i++)
    {
    temp = temp.nextChild;
    }
    while(this.len!=1){
    //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 = temp.nextChild;
    this.len--;
    }
    System.out.println("最后出圈" +temp.no);
    }

    //初始化环形链表
    public void creatLink()
    {
    for(int i=1;i<len;i++)
    {
    if(i==1)
    {//创建第一个小孩
    Child ch = new Child(i);
    this.firstchild = ch;
    this.temp = ch;
    }
    else 
    {
    //创建最后一个小孩
    if(i==len)
    {
    //继续创建小孩
    Child ch = new Child(i);
    temp.nextChild = ch;
    temp = ch;
    temp.nextChild=this.firstchild;
    }
    else
    {
    Child ch = new Child(i);
    temp.nextChild=ch;
    temp=ch;
    }
    }
    }
    }
    public void show()
    {

    Child temp = this.firstchild;
    do{
    System.out.print(temp.no+" ");
    temp = temp.nextChild;

    }while(temp != this.firstchild);
    System.out.println("跳出循环了");
    }
    }
      

  4.   

    是一样的错呀,如果try catch 就说是空指针
      

  5.   

    Child ch = new Child(i);
    temp.nextChild=ch;
    temp=ch;
    ch 的nextChild 是null
    然后你每次最后 temp=ch 就等于将ch的引用给temp了 然后 temp的nextChild也是null了
    然后你又在
    for(int j=1;j<m;j++)
    {
    temp =temp.nextChild;
    }
    第一次循环将null给temp了,第二次循环时就空指针了
      

  6.   

     ch的nextChild怎么会是null呢,链表不是这样构建的哇,那我应该怎么办呀?
      

  7.   

        Child nextChild = null;   这句有问题。  还有就是你的 child 类里,又有一个 child 的对象,这样初始化时,是非常麻烦的。
      

  8.   

    就是这样的说  Child ch = new Child(i); class Child{
    int no;
    Child nextChild = null;   
     public Child(int no)
    {
    //给一个编号
    this.no=no;
    }
    }
      

  9.   

    package zicheng;public class Josephu { public static void main(String[] args)throws Exception
    {

    CycLink cyclink = new CycLink();
    cyclink.setLen(5);
    cyclink.creatLink();
    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;

    //设置链表的大小
    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;
    //1.知道开始数数的人
    for(int i=1;i<k;i++)
    {
    temp = temp.nextChild;
    }
    while(this.len!=1){
    //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 = temp.nextChild;
    this.len--;

    }
    System.out.println("最后出圈" +temp.no);
    }

    //初始化环形链表
    public void creatLink()
    {
    for(int i=1;i<=len;i++)
    {
    if(i==1)
    {//创建第一个小孩
    Child ch = new Child(i);
    this.firstchild = ch;
    this.temp = ch;
    }
    else 
    {
    //创建最后一个小孩
    if(i==len)
    {
    //继续创建小孩
    Child ch = new Child(i);
    temp.nextChild = ch;
    temp = ch;
    temp.nextChild=this.firstchild;
    }
    else
    {
    Child ch = new Child(i);
    temp.nextChild=ch;
    temp=ch;
    }
    }
    }
    }
    public void show()
    {

    Child temp = this.firstchild;
    do{
    System.out.print(temp.no+" ");
    temp = temp.nextChild;

    }while(temp != this.firstchild);
    System.out.println("跳出循环了");
    }
    }   约瑟夫问题~~~