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; } } }
标签:Node,pre,结点,..,count,next,item From: https://www.cnblogs.com/lgy198/p/17899878.html