您的位置:首页 > 编程语言 > Java开发

环形链表实现约瑟夫问题 java语言

2013-06-04 16:17 603 查看
约瑟夫问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,剩下一个人。
public class Juseph{public static void main(String[] args){SysLink syslink = new SysLink();syslink.setNodeLen(10);syslink.createLink();syslink.setBeginNo(5);syslink.setM(5);syslink.showLink();syslink.start();}}//环形链表类class SysLink{//节点数private int nodeLen=0;//从第几个节点开始数数private int beginNo;//数几下private int m;//第一个节点Node firstNode = null;//设置游标Node temp = null;//设置节点数public void setNodeLen(int len){this.nodeLen = len;}//设置数几下public void setM(int m){this.m = m ;}//设置从第几个节点开始数public void setBeginNo(int n){this.beginNo = n ;}//创建环形链表public void createLink(){//循环创建每个节点for(int i = 1;i <= nodeLen;i++){//当创建第一个节点时或者只有一个节点if(i==1){Node node=new Node(i);//将firstNode节点指向新创建的第一个节点this.firstNode = node;//将temp节点指向新生成的节点this.temp = node;//将生成的节点指向头节点node.next = firstNode;}else{//当不是最后一个节点时if (i!=nodeLen){//新生成节点Node node = new Node(i);//将temp的下一个节点指向新生成的节点this.temp.next = node;//并将temp节点下移this.temp = node;}//最后一个节点else{Node node = new Node(i);temp.next = node ;temp = node ;//将新生成节点指向第一个节点,形成环node.next = firstNode;}}}}//开始public void start(){//找到开始数的节点//从第一个节点开始Node temp=this.firstNode;for (int i = 1; i < beginNo; i++){temp = temp.next ;}while(nodeLen!=1){//数几下for (int j = 0; j < m-1; j++){temp = temp.next;}//找到temp前一个节点Node temp2 = temp ;while (temp2.next!=temp){temp2= temp2.next;}//将temp除去temp2.next = temp.next;System.out.println("出圈的人是:"+temp.no);temp = temp.next ;this.nodeLen--;}System.out.println("最后剩下的是:"+temp.no);}//打印链表public void showLink(){Node temp = this.firstNode;//当只有一个节点时if (temp.next.no == 1){System.out.println(temp.no);}else{while (temp.next!=firstNode){System.out.println(temp.no);temp = temp.next;}}System.out.println(temp.no);}}//节点类class Node{//节点的编号int no;//创建节点类型Node next=null;//构造函数public Node(int no){this.no=no;}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: