单向循环链表解决约瑟夫问题,循环约瑟夫,约瑟夫(Joseph)问
分享于 点击 45563 次 点评:186
单向循环链表解决约瑟夫问题,循环约瑟夫,约瑟夫(Joseph)问
约瑟夫(Joseph)问题:设置编号为1,2,3,...,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一个又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
public class Joseph { public static void main(String[] args) { CycLink cyclink = new CycLink(); cyclink.setLen(10); cyclink.createLink(); cyclink.setK(2); cyclink.setM(2); 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 createLink() { for (int i = 1; i <= len; i++) { Child ch = new Child(i); if (i == 1) { this.firstChild = ch; this.temp = ch; } else if (i == len) { temp.nextChild = ch; temp = ch; temp.nextChild = this.firstChild; } else { temp.nextChild = ch; temp = ch; } } } //输出序列 public void show(Child temp) { System.out.print(temp.no + " "); } // 设置第k个人开始 public void setK(int k) { this.k = k; } // 设置数到m public void setM(int m) { this.m = m; } // 开始play public void play() { Child temp = this.firstChild; //找到第k个人 for (int i = 1; i < k; i++) { temp = temp.nextChild; } while (this.len != 0) { for (int i = 1; i < m; i++) { temp = temp.nextChild; }//数m次 //输出序列 show(temp); //删除节点temp(将temp的下一个节点tem的内容交给temp,从而达到删除temp的效果) Child tem = temp.nextChild; temp.no = tem.no; temp.nextChild = tem.nextChild; this.len--; } }}//该片段来自于http://byrx.net
用户点评