注意以下代码略去package和import语句
Person类来描述每个人及其手中的密码,作为线性表中的元素类型
public class Person {
private String name; //用老几来表示
private int pwd; //每个人手中持有的密码,作为下次的报数值
public Person(String name,int pwd)
{
this.name = name;
this.pwd = pwd;
}
public String getName() {
return name;
}
public int getPwd() {
return pwd;
}
}
接下来是使用单链表的方式来解决的代码
public class Client {
public static void main(String[] args)
{
<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">MyLinkedList</span> list = new MyLinkedList();//此处也可以使用顺序表来实现
Person p1 = new Person("老一",3);
Person p2 = new Person("老二",1);
Person p3 = new Person("老三",7);
Person p4 = new Person("老四",2);
Person p5 = new Person("老五",4);
Person p6 = new Person("老六",8);
Person p7 = new Person("老七",4);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
Client c = new Client();
c.joseph(list,1,6);
}
//begin为开始的人的位置,range为计数值,初始为上图中的m
public void joseph(<span style="font-family: Arial, Helvetica, sans-serif;">MyLinkedList </span>list, int begin, int range)
{
//要做得事情:依次打印出出来的人的名字
/* step1: 找到要删除的那个人的位置,
* step2: 拿到要删除的那个人的密码,作为下一次的range
* step3: 删除掉这个人
* 循环做这3步,直到...结束
*/
int found; //found表示找到的这个人的位置
System.out.println("依次出来的人为:");
while( list.getLength() > 0)
{
found = (begin + range -1) % list.getLength();
if(found == 0)
found = list.getLength();
Person p = (Person)list.getElement(found);
range = p.getPwd();
System.out.print(p.getName() + ",");
list.delete(found);
begin = found;
}
}
}
当然项目中少不了上课时讲的MyLinkedList类了,上课你没有拷贝,去我们百度云的上课资料中找。