![]()
![]()
package com;
public class JosephTest {
public static void main(String[] args) {
//解决约瑟夫问题
//1.构建循环链表 包含41个结点
Node<Integer> first = null; //记录首节点
Node<Integer> pre = null; //记录上一个结点
for(int i = 1; i <= 41; i++){
//如果是第一个结点
if(i == 1){
first = new Node<>(i,null);
pre = first;
continue; //跳过此次循环 进入i=2
}
//如果不是第一个结点
Node<Integer> newNode = new Node<>(i, null);
pre.next = newNode; // 1.next = 2 将链表串起来
pre = newNode; //pre后移 pre = 2
//如果是最后一个结点,那么让最后一个结点的下一个结点为 first , 变为循环链表了
if(i == 41){
pre.next = first; //最后一个结点和第一个结点串起来,成为循环链表
}
}
//2.需要count计数器 模拟报数
int count = 0;
//3.遍历循环链表
Node<Integer> n = first; //拿到第一个结点
Node<Integer> before = null; // 当前结点的上一个结点
//如果删除就剩最后一个元素时,会形成自环
while(n != n.next){
//模拟报数
count++;
//判断当前报数是不是为3
if(count == 3){
//如果是3,则把当前结点删除调用,打印当前结点,重置count,让n后移
before.next = n.next; //before = 2, n = 3
System.out.print(n.item+" ");
count = 0;
n = n.next; //后移到 3 的下一个
}else{
//如果不是3 让before变为当前结点,让当前结点后移
before = n;
n = n.next; // 列 第一个 为1 不是3 则 n =2
}
}
//打印最后一个元素
System.out.print(n.item);
}
private static class Node<T>{
T item;
Node next;
public Node(T item,Node next){
this.item = item;
this.next = next;
}
}
}