[NC132 环形链表的约瑟夫问题](NC132 环形链表的约瑟夫问题)
编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。
下一个人继续从 1 开始报数。
n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?
typedef struct ListNode ListNode;
ListNode* BuyNode(int val) {
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
if (node == NULL) {
exit(-1);
}
node->val = val;
node->next = NULL;
return node;
}
ListNode* CreateList(int n) {
ListNode* phead = BuyNode(1);
ListNode* ptail = phead;
for (int i = 2; i <= n; ++i) {
ptail->next = BuyNode(i);
ptail = ptail->next;
}
ptail->next = phead;
return phead;
}
int ysf(int n, int m ) {
ListNode* phead = CreateList(n);
int k = 0; // 报数编号
ListNode* cur = phead;
ListNode* prev = NULL;
while (cur->next != cur) {
if (++k == m) { // 报数
k = 0;
prev->next = cur->next;
free(cur); // 离开
cur = prev->next;
} else {
prev = cur;
cur = cur->next;
}
}
return cur->val;
}