public int LastRemaining_Solution(int n, int m)
{
    if(n<=0||m<1)return -1;
    List<int> list = new List<int>();//用List模拟循环链表
    for(int i =0;i<n;i++)
    {
        list.Add(i);//把小朋友的编号赋值
    }
    int cur = -1;//用cur来表示当前报数的索引
    while(list.Count>1)
    {
        for(int i =0;i<m;i++)//每次移动m个小朋友,第m个就是要报数的
        {
            ++cur;//第一个小朋友编号0,cur=-1+1=0,后面每次报数以此类推++
            if(cur == list.Count)cur = 0;//cur代表数组下标,下标最大为list.Count-1,因此此时这个报数者应该回到List头,即List[0]             
        }
        list.Remove(list[cur]);//完整移动一次,remove一次;
        cur--;   //当前元素删除了,后面的元素会移动上来,所以让cur--,这样下一个就是正确的人
    }
    return list[0];//只剩下一个人了,所以返回这个小朋友的编号就对了
}