约瑟夫问题
一、约瑟夫问题
1.问题叙述:
2.解题思路
1)构建含有41个结点的单链表,分别存储1-41的值,代表着41个人
2)使用计数器count,记录当前的值
3)遍历链表,每循环一次链表++
4)判断count的值,如果为三则删除此结点,count置为0
public class JoseTest{ public static void main(String[] args) { //定义首结点 Node<Integer> first =null; Node<Integer> pre = null; //定义循环链表 for (int i=1;i<=41;i++){ //1.如果是第一个结点 if(i==1){ first = new Node<>(i, null); pre=first; continue; } //2.如果不是第一个,创建新结点 Node<Integer> newNode = new Node<>(i, null); //让上一个结点指向当前结点 pre.next=newNode; //重置pre,让pre代表当前结点 pre=newNode; //如果为41个结点时 if(i==41){ pre.next=first; } } //模拟报数 int count=0; //遍历循环链表 Node<Integer> n=first; Node<Integer> before=null; while (n!=n.next){ count++; if(count==3){ //删除该结点,n的上一个结点指向下一个结点 before.next=n.next; System.out.print(n.item+","); //重置count count=0; n=n.next; }else{ before=n; n=n.next; } } //最后一个元素 System.out.println(n.item); } public static class Node<T>{ T item; Node next; public Node(T item, Node next) { this.item = item; this.next = next; } } }