数据结构值约瑟夫环问题

来源:互联网 发布:费用优化方案 编辑:程序博客网 时间:2024/06/10 21:34

注意以下代码略去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类了,上课你没有拷贝,去我们百度云的上课资料中找。





0 0