..

 

  

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;
        }
    }

}

 

posted @ 2023-12-13 20:38  哩哩1  阅读(8)  评论(0)    收藏  举报