思路:建立一个环形链表模拟这个过程即可。可以用STL的list来模拟环形链表,在遍历到链表的尾部的时候记得把指针弄到链表头部就好了。
#include <iostream>
#include <cstring>
#include<string>
#include <cstdio>
#include<queue>
#include<stack>
#include<list>
using namespace std;
class Solution {
public:
list<int>L;
int LastRemaining_Solution(int n, int m)
{
if(n < 1 || m < 1)
return -1;
for(int i = 0; i < n; i++)
L.push_back (i);
list<int>::iterator it = L.begin();
while(L.size() > 1)//删除只保留一个数字
{
for(int i = 0; i < m - 1; i++)//找到从0开始数的第m个数字
{
it++;
if(it == L.end() )//迭代器移动到尾部就把其放到链表头部
it = L.begin();
}
it = L.erase(it);//删除第m个数字并返回迭代器的下一个元素
if(it == L.end() )//再次检测是否到尾部
it = L.begin();
}
return L.front();//剩下的最后一个元素肯定就是头部了
}
};