约瑟夫问题
约瑟夫问题
Josephu问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号k(1<=k<=n)的人从 1 开始报数,数到m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
利用环链表来解决约瑟夫问题,出列对应将节点从链表中删除。
思路分析

public void count(int k, int m, int nums) {
//数据校验
if (head == null || k < 1 ) {
System.out.println("输入有误");
return;
}
//定义辅助变量,进行遍历
Node help = head;
//判断help是否是指向化环形链表的最后一个位置
while (true) {
if (help.next == head) {//已经找到了链表最后一个位置
break;
}
help=help.next;
}
//从k个数开始数,则head,temp需要移动k-1次
for(int i=0;i<k-1;i++){
head=head.next;
help=help.next;
}
//移动m次出圈,直到环形数组中只有一个节点时,需要利用while()
while(true){
if(help==head){//圈中只有一个节点
break;
}
for(int j=0;j<m-1;j++){
head=head.next;
help=help.next;
}
//这是head指向的节点就是要出圈的节点
System.out.println("出圈的编号为"+head.No);
head=head.next;
help=head;
}
System.out.println("留在圈中的编号"+head.No);
}

浙公网安备 33010602011771号