循环链表,STL实现约瑟夫

来源:互联网 发布:高帮男鞋 知乎 编辑:程序博客网 时间:2024/06/18 15:41
#include<iostream>
#include<list>
using namespace std;
struct ListNode
{
int num;        //编号
ListNode *next; //下一个
/*ListNode(int n,ListNode *p)
{
num = n;
next= p;
}*/
};
ListNode *listnode;
//自定义链表实现
int JosephusProblem_Solution1(int n, int m)
{
if(n < 1 || m < 1)
return -1;


ListNode *pHead = new ListNode(); //头结点
ListNode *pCurrentNode = pHead;   //当前结点
ListNode *pLastNode = NULL;       //前一个结点
unsigned i;


//构造环链表
for(i = 1; i < n; i++)
{
listnode = new ListNode();
listnode->num = i;
pCurrentNode->next = listnode;
pCurrentNode = listnode;//pCurrentNode->next
//pCurrentNode->next = new ListNode(i);
//pCurrentNode = pCurrentNode->next;
}
pCurrentNode->next = pHead;


//循环遍历
pCurrentNode = pHead;


while(pCurrentNode->next != pCurrentNode)
{
//前进m - 1步
for(i = 0; i < m; i++)
{
pLastNode = pCurrentNode;
pCurrentNode = pCurrentNode->next;
}
//删除报到m - 1的数
pLastNode->next = pCurrentNode->next;
cout<<pCurrentNode->num;
delete pCurrentNode;
pCurrentNode = pLastNode->next;
}
//释放空间
int result = pCurrentNode->num;
delete pCurrentNode;


return result;
}


//使用标准库
int JosephusProblem_Solution3(int n, int m)
{
if(n < 1 || m < 1)
return -1;


list<int> listInt;
unsigned i;
//初始化链表
for(i = 0; i < n; i++)
listInt.push_back(i);


list<int>::iterator iterCurrent = listInt.begin();
while(listInt.size() > 1)
{
//前进m - 1步
for(i = 0; i < m; i++)
{
if(++iterCurrent == listInt.end())
iterCurrent = listInt.begin();
}
//临时保存删除的结点
list<int>::iterator iterDel = iterCurrent;
cout<<*iterDel;
if(++iterCurrent == listInt.end())
iterCurrent = listInt.begin();
//删除结点
listInt.erase(iterDel);
}


return *iterCurrent;
}


int main()
{
JosephusProblem_Solution1(8,5);
cout<<endl;
JosephusProblem_Solution3(8,5);
return 0;
}
0 0