import java.util.*; public class Solution { public int LastRemaining_Solution(int n, int m) { //边界条件 if(n<1||m<1){ return -1; } //构建链表模拟环形队列 List<Integer> deque=new ArrayList<Integer>(); //环形队列站小朋友 for(int i=0;i<n;i++){ deque.add(i); } //开始游戏,直到剩下一个小朋友 //定义一个指针,指向每次游戏需要出队列的小朋友,指针初始时不指向任何一个小朋友 int cur=-1; while(deque.size()>1){ //开始报数 for(int i=0;i<m;i++){ //指针开始移动 cur++; //因为是环形队列,所以cur指向deque.size()+1的位置时,刚好位移 //位于环形队列的头结点 if(cur==deque.size()){ cur=0; } } //当一次游戏结束时,此时的cur指向的小朋友出队列 deque.remove(cur); //cur指针后退一步 cur--; } return deque.get(0); } }