本文地址: http://blog.csdn.net/caroline_wendy
题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0开始每次从这个圆圈里删除第m个数字.
求出这个圆圈里最后剩下的数字.
使用循环链表, 依次遍历删除, 时间复杂度O(mn), 空间复杂度O(n).
代码:
/*
 * main.cpp
 *
 *  Created on: 2014.7.13
 *      Author: Spike
 */
#include <iostream>
#include <list>
using namespace std;
int LastRemaining (size_t n, size_t m) {
	if (n<1 || m<1)
		return -1;
	list<size_t> numbers;
	for(size_t i=0; i<n; ++i)
		numbers.push_back(i);
	list<size_t>::iterator current = numbers.begin();
	while (numbers.size() > 1) {
		for (size_t i=1; i<m; ++i) {
			current++;
			if (current == numbers.end())
				current = numbers.begin();
		}
		list<size_t>::iterator next = ++current; //指向下一个
		if (next == numbers.end())
			next = numbers.begin();
		--current;
		numbers.erase(current);
		current = next;
	}
	return *(current);
}
int main(void)
{
    int result = LastRemaining(5, 3);
    std::cout << "result = " << result << std::endl;
    return 0;
}
result = 3
编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++),布布扣,bubuko.com
编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)
原文:http://blog.csdn.net/caroline_wendy/article/details/37735653