【C++环形链表】报数问题

题目:国庆节临近,某企业老板想给员工们发放礼物,但是发礼物的顺序并没有决定,所以老板决定将员工们编号为1,2,3…m,员工们(m个)按照1-m的顺序围坐一圈。从第1个开始数,每数到第n个,这个员工就会拿到礼物并离开此圈,并从下一个员工开始重复该过程,直到所有人都拿到礼物。输入m和n,输出最后一个拿到礼物的员工编号。

下面是我的代码,在VS上成功运行,且尝试的情况都正确输出;但提交到oj上一直显示错误,请问哪里存在问题?


#include<iostream>
using namespace std;
class list;
class node {
    friend list;
public:
    node(int i) { num = i; next = NULL; }
    node* getnext() { return next; }
    void removeafter() {
        node* p = next;
        next = next->next;
        delete p;
    }
private:
    int num;
    node* next;
};
class list {
public:
    list() { head = tail = NULL; }
    list(node* p) { head = tail = p; }
    list(int m) {
        node* it = new node(1);
        node* before = it;
        head = it;
        for (int i = 2; i <= m; i++) {
            it = new node(i);
            before->next = it;
            before = it;
        }
        tail = it;
        tail->next = head;
    }
    ~list() {
        node* q = tail;
        node* p = head;
        while (p != q) {
            q->next = p->next;
            delete p;
            p = q->next;
        }
        delete tail;
    }
    int length();
    int last(int m);
private:
    node* head, * tail;
};
int list::length() {
    if (head == NULL)
        return 0;
    int n = 1;
    node* it = head;
    while (it != tail) {
        it = it->next;
        n++;
    }
    return n;
}
int list::last(int n) {
    node* p = tail;
    node* q = head;
    while (p != q) {
        for (int i = 1; i < n; i++) {
            p = p->next;
            q = q->next;
        }
        p->next = q->next;
        delete q;
        q = p->next;
    }
    return p->num;
}
int main() {
    int m, n;
    cin >> m >> n;
    if (m <= 0 || n <= 0) {
        cout << "invalid input!\n";
        return 0;
    }
    list* thelist = new list(m);
    cout << endl << thelist->last(n);
}

cout << endl << thelist->last(n);
应该是
cout << thelist->last(n)<< endl;吧