直接上代码哈。视频里的例子,我编译通过了,但是运行就报这个错误,我找不到错误在哪儿啊。
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("条出循环了");
}
}
------解决方案--------------------
试下在main()后面加上 throws Exception试试!
------解决方案--------------------
代码贴贴好。
------解决方案--------------------
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了,第二次循环时就空指针了
------解决方案--------------------
Child nextChild = null; 这句有问题。 还有就是你的 child 类里,又有一个 child 的对象,这样初始化时,是非常麻烦的。
------解决方案--------------------
就是这样的说 Child ch = new Child(i);
class Child{
int no;
Child nextChild = null;
public Child(int no)
{
//给一个编号
this.no=no;
}
}
------解决方案--------------------