在解决约瑟夫问题上,利用无表头的单循环链表是相当简单的,可以将约瑟夫问题当作链表的删去节点操作。
约瑟夫问题:已知n个人围坐在一张圆桌周围。从编号为s的人开始报数,数到m的那个人出列;又从其下一个人开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
解题思路:
1.产生length=n的单循环链表
2.重置first指针,令第s个人的位置为新的first(起点)
3.while(n)
{
删除第m个节点;
重置first指针,获得新起点;
}
通过这样,可以解决约瑟夫问题,此解法关键是重置first位置。
PS:如果有更好的解决思路,或者代码有缺陷的地方,请告知我,谢谢!
1.头文件:
#ifndef CHAIN_H
#define CHAIN_H
#include<iostream>
//约瑟夫问题利用无表头的单循环链表是最佳的
//将有表头的单循环链表稍作修改成无表头
template<class T>
class chainnode
{
template<class T>
friend class chain;
public:
chainnode()
{
next = nullptr;
data = 0;
}
~chainnode()
{
}
void setdata(const T& dat)
{
data = dat;
}
public:
T getdata()
{
return data;
}
chainnode<T>* getnext()
{
return next;
}
private:
T data;
chainnode<T>* next;
};
template<class T>
class chain
{
public:
chain()
{
length = 0;
fi