js
//定义了一个双向链表的节点
function
Node(n,before,next) {
this
.n = n;
this
.before = before;
this
.next = next;
}
var
node =
new
Node(1,
null
,
null
);
var
linked = node;
for
(
var
i =2;i <= 50;i++) {
var
temp =
new
Node(i,
null
,
null
);
//双向链表构建关联是前驱和后继两个
node.next = temp;
temp.before = node;
node = node.next;
}
//第50个和第1个拉手
node.next = linked;
linked.before = node;
//出列的逻辑
node = linked;
for
(
var
i = 1;;i++) {
if
(node.next == node) {
//剩下一个node了
break
;
}
if
(i % 3 == 0) {
//node出列
node.before.next = node.next;
node.next.before = node.before;
}
node = node.next;
}
document.write(node.n);
_______________________________________________________________________________________________________________
java
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Scanner;
public
class
Yue {
public
static
void
main(String[] args) {
// Scanner scanner = new Scanner(System.in);
// System.out.print("请输入总人数:");
// int totalNum = scanner.nextInt();
// System.out.print("请输入报数的大小:");
// int cycleNum = scanner.nextInt();
// System.out.print("请输入开始编号:");
// int startNO= scanner.nextInt();
// yuesefu(totalNum, cycleNum,startNO);
yuesefu(
5
,
2
,
3
);
}
public
static
void
yuesefu(
int
totalNum,
int
countNum,
int
startNO) {
// 初始化人数
List<Integer> start =
new
ArrayList<Integer>();
for
(
int
i =
1
; i <= totalNum; i++) {
start.add(i);
}
//从下标为K开始计数
int
k = startNO-
1
;
while
(start.size() >
0
) {
System.out.println(start);
//第m人的索引位置
k = (k + countNum) % (start.size()) -
1
;
// 判断是否到队尾 到队尾时候k=-1
if
(k <
0
) {
System.out.println(start.get(start.size()-
1
));
start.remove(start.size() -
1
);
k =
0
;
}
else
{
System.out.println(start.get(k));
start.remove(k);
}
}
}
}