题目描述:
0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次依次从这个圈中删除第m个数字,求圆圈中最后剩下的数字。
思路:
还是用经典的环形链表解决。
1. 从0...n-1构建循环链表
2. 循环链表中依次删除第m个数字,此OJ中如m=2 则从0开始要删除012中的2,有第0个
3. 返回最后剩下的数字
代码:
语言C++,已通过牛客网在线测试。
class Solution {
//使用链表来解决
//0...n-1构建循环链表
//循环链表中依次删除第m个数字,此OJ中如m=2 则从0开始要删除012中的2,有第0个
//返回最后剩下的数字
private:
struct ListNode{
int val;
struct ListNode* next;
ListNode(int x): val(x), next(NULL){}
};
public:
int LastRemaining_Solution(int n, int m)
{
if(n < 1 || m < 1) return -1;
ListNode *head = new ListNode(0);
ListNode *pre = head;
for(int i = 1; i < n; i++){//创建链表,0已经有了 从1开始创建
ListNode *tmp = new ListNode(i);
pre->next = tmp;
pre = pre->next;
}
pre->next = head;//串成环
while(n != 1){
for(int i = 1; i < m - 1; i++) head = head->next;//找到要删除的上一个
head->next = head->next->next;
head = head->next;
n--;
}
return head->val;
}
};