目录
n个人,起始位置k,报到m踢出,从m+1开始继续报m,直到只剩一个人。
问题
问题简述:
n个人,起始位置k,报到m踢出,从m+1开始继续报m,直到只剩一个人。
解决思路:
-
构建循环链表:让最后一个结点指向第一个结点
head->next = nullptr; Node *prev = head; for (int i = 1; i <= n; i++) { Node *newNode = new Node(i); prev->next = newNode; prev = prev->next; } prev->next = head->next;
prev->next = head->next;
-
找到位置k的结点:(找到k的上一个结点方便删除)
Node *p = head->next; for (int i = 1; i < k; i++) { p = p->next; }
-
删除报数m的结点
Node *p = first;//为找到的起始结点
while (p != p->next) { //当结点有一个以上时
for (int i = 1; i < m - 1; i++) {//找结点
p = p->next;
}
Node *temp = p->next; //删除
cout << temp->val << endl;
p->next = p->next->next;
delete temp;
p = p->next; //p需要继续遍历下一个
}
cout << p->val; //最后一个需要打印