一、问题重述:
n 个人围成一个圆圈,首先第 1 个人从 1 开始,一个人一个人顺时针报数, 报到第 m 个人,令其出列。然后再从下一 个人开始,从 1 顺时针报数,报到第 m 个人,再令其出列,…,如此下去, 直到圆圈中只剩一个人为止。此人即为优胜者,请输出优胜者。
二、实现思路:
将结点的数据域存储元素的序号,通过链表的遍历、元素的查询(search)、元素的删除(remove)等方法便可以较容易实现。
三、下面是具体代码实现思路:
首先是单向循环链表的实现:
enum InsMod {INF, INR};//头插还是尾插
template <typename T>class CircLinkNode{
public:
T data;
CircLinkNode<T> *link;
CircLinkNode(CircLinkNode<T> *ptr = NULL){//建立空结点
link = ptr;
}
CircLinkNode(const T &item, CircLinkNode<T> *ptr = NULL){//建立非空结点
data = item;
link = ptr;
}
};
template <typename T>class CircList{
public:
CircList()
{
this->first = new CircLinkNode<T>();
first->link=first;
last=first;
}
CircList(CircList<T> &L)//复制一个环链表
{
CircLinkNode<T>* p = L.first->link;
CircLinkNode<T>*q = this->first->link;
while(p!=first)
{
q= new CircLinkNode<T>(p->data);
q=q->link;
p=p->link;
}
last = q;
}
~CircList()
{
this->makeEmpty();
delete this->first;
}
void makeEmpty()
{
CircLinkNode<T>*p = this->first->link;
CircLinkNode<T>*q = p->link;
while(p!=first)
{
delete p;
p = q;
q=q->link;
}
}
int Length()const
{
int num =1;
CircLinkNode<T>* p = first->link;
while(p!=first)
{
++num;
p=p->link;
}
return num;
}