Josephu 问题
设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:
用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
代码:
public class CirlcleSingleLinkedListDemo {
public static void main(String[] args) {
CircleLinkedList list = new CircleLinkedList();
list.addNode(5);
list.showList();
System.out.println("===============================");
list.putNode(1, 2, 5);
}
}
class CircleLinkedList{
private CircleLinkedListNode first ; //第一个有效节点
private CircleLinkedListNode current; //当前刚添加的节点 //最后一个节点
//添加num个节点
public void addNode(int num){
for (int i = 1; i <=num ; i++) {
CircleLinkedListNode node = new CircleLinkedListNode(i, "节点"+i);
if (first == null){
first = node;
node.setNext(first);
current = first;
}else {
current.setNext(node);
current = node;
node.setNext(first);
}
}
}
/**
*
* @param startNo 从第几个开始开始
* @param countNum 每次的步数
* @param num 有几个节点
*/
public void putNode(int startNo , int countNum , int num){
if(first==null||countNum<=0||countNum>num){
System.out.println("参数有误!");
return;
}
CircleLinkedListNode temp = current;//辅助节点指向链表的最后一个节点
for (int i = 0; i < startNo-1 ; i++) { //将辅助节点移动到开始节点的前一个
temp =temp.getNext();
}
while (num>=1){
for (int i = 0; i < countNum-1 ; i++) { //将辅助节点移动到出列节点的前一个
temp =temp.getNext();
}
System.out.println(temp.getNext());
temp.setNext(temp.getNext().getNext()); //删除出列节点
num--;
}
}
//遍历显示链表
public void showList(){
if (first==null){
System.out.println("链表为空");
return;
}
CircleLinkedListNode temp = first;
do {
System.out.println(temp);
temp = temp.getNext();
}while (temp!=first);
}
}
//节点类
class CircleLinkedListNode {
private int no;
private String name;
private CircleLinkedListNode next;
public CircleLinkedListNode(int no, String name) {
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CircleLinkedListNode getNext() {
return next;
}
public void setNext(CircleLinkedListNode next) {
this.next = next;
}
@Override
public String toString() {
return "CircleLinkedList{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}