问题描述
N个人围成一圈,从第M个开始报数,第K个将被杀掉。例如M=1,N=6,K=5 被杀掉的顺序是:546231
心路历程
使用循环单链表模拟,主要一个问题就是当k=1时找第一个节点的前一个节点,法一是找一个空头结点辅助
,另外就是遍历
一次寻找,我用的后面那种。
- 流程
1.构建链表
2.查找第m的上一个节点
3.while根据规律循环删除所有节点 - 代码
1.一个kid类,作为结构体,重写了toString方便打印,带参构造方法
2.main
/**
* 2022-06-29 15:56
* 例如 m,n,k = 1,10,3-->3 6 9 2 7 1 8 5 10 4
*/
public class Joseph {
static class kid {
int num;
kid next;
kid(int num, kid next) {
this.num = num;
this.next = next;
}
@Override
public String toString() {
return num+"";
}
}
// n个人,从m开始,数到k,编号从1开始
public static void main(String[] args) {
int m = 1;
int n = 6;
int k = 5;
kid first = null;
kid last = null;
kid cur = null;
for (int i = 1; i <= n; i++) {
if(first == null){
first = new kid(i,null);
last = first;
cur = first;
cur.next = cur;
} else {
cur = new kid(i,first);
last.next = cur;
last = cur;
}
}
// 找到第k个位置的前一个位置
// 前一个位置 -1 ;编号从1开始-1;所以减2
for (int i = 0; i < k+m-2; i++) {
first = first.next;
System.out.println(first);
}
while(cur.next != first){
cur = cur.next;
System.out.println(cur);
}
System.out.print(cur.next+ " ");
cur.next = cur.next.next;
n--;
while(n!=0){
for (int i = 0; i < k-1; i++) {
cur = cur.next;
}
System.out.print(cur.next+" ");
cur.next = cur.next.next;
n--;
}
}
}