使用环形链表解决

#include <vector>
#include <algorithm>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x = 0) : val(x), next(nullptr) {}
};

ListNode* createNode(int value) {
    ListNode* newNode = new ListNode();
    newNode->val = value;
    newNode->next = nullptr; // 或者 newNode->next = NULL; 依编译器和标准库版本而定
    return newNode;
}

void createCircularLinkedList(ListNode*& head, int size) {
    if (size <= 0) return;

    head = new ListNode(0);
    ListNode* current = head;

    for (int i = 1; i < size; ++i) {
        ListNode* newNode = createNode(i);
        current->next = newNode;
        current = newNode;
    }

    // 将最后一个节点的 next 指针指向头节点,形成环形链表
    current->next = head;
}

void printCircularLinkedList(ListNode* head) {
    if (!head) return;

    ListNode* current = head;
    do {
        cout << current->val << " ";
        current = current->next;
    } while (current != head);
    cout << endl;
}

int findSurvivor(int n, int k, int m){
    ListNode* head = new ListNode(0);
    createCircularLinkedList(head, n);
    for (int i = 0; i < k; i++) {
        head = head -> next;
    }
    ListNode* current = head;
    ListNode* prev = nullptr;

    // 当只剩下一个节点时停止
    while (current->next != current) { // More than one node
        // Move m-1 times
        for (int count = 1; count < m; ++count) {
            prev = current;
            current = current->next;
        }
        // Remove current
        prev->next = current->next; // Skip the current node
        delete current; // Free memory
        current = prev->next; // Move to next
    }
    int result = current->val; // Last remaining node
    delete current; // Clean up
    return result;
}


int main() 
{
    int n, k, m;
    cin >> n >> k >> m;
    cout << findSurvivor(n, k, m) << endl;
    return 0;
}