package linkedlist;
//约瑟夫环
public class JosephuCircle {
public static void main(String[] args) {
JosephuCircle jsCircle = new JosephuCircle();
jsCircle.createNodeList(10);
jsCircle.show();
jsCircle.outCircle(2, 2);
}
Node first = null, tail = null;
// 创建环状链表
public void createNodeList(int k) {
int count = 1;
first = tail = null;
while (count <= k) {
if (first == null) {
first = tail = new Node(count);
} else {
Node node = new Node(count);
tail.next = node;
tail = node;
}
count++;
}
tail.next = first;
}
// 显示链表
public void show() {
Node temp = first;
if (first == null) {
System.out.println("空链表");
return;
}
while (true) {
System.out.println(temp);
if (temp.next == first) {
break;
}
temp = temp.next;
}
}
/**
* 约瑟夫环数到第k个出圈
*
* @param start 开始的结点
* @param k数到第k个出圈
*/
public void outCircle(int start, int k) {
if (first == null || start < 1) {
System.out.println("条件不足,无法开始此游戏");
return;
}
// 目前初始化,让tempNode 指向第一个结点,signNode指向tempNode节点的前一个结点也就是最后一个结点
Node signNode = tail;
Node tempNode = first;
int s = k, count = 0;
// 从第start个开始,表示signNode和 tempNode 向后移动第start-1个
for (int i = 0; i < start - 1; i++) {
tempNode = tempNode.next;
signNode = signNode.next;
}
while (true) {
if (signNode == tempNode) {// 表示只剩下最后一个了
break;
}
for (int i = 0; i < s - 1; i++) {// 数k个表示向后移动k-1个
tempNode = tempNode.next;
signNode = signNode.next;
}
count++;
System.out.println("第" + count + "出圈的结点是" + tempNode);
tempNode = tempNode.next;
signNode.next = tempNode;
}
System.out.println("最后剩下的是" + tempNode);
}
}
09-18
1447