NOI题目地址(3.2数据结构之指针和链表):http://noi.openjudge.cn/ch0302/
这部分的题解出于练习指针和链表的目的,我都是自定义的链表结构。实际上C++提供了STL list链表容器,对于链表元素的增删查反转等操作都有封装好的接口,直接使用将会得到非常简洁的代码。
1748:约瑟夫问题
分析:
用循环链表解决约瑟夫环问题
关键在于:
- 删除链表结点的操作
- 注意对循环链表prev指针的处理
AC题解:
#include <iostream>
using namespace std;
struct node
{
int data;
node* next;
};
node *link_create(int n)
{
// 创建第一个节点
node *head;
node *p = new node();
p->data = 1;
head = p;
for(int i=2;i<=n;i++)
{
node *q = new node();
q->data = i;
p->next = q;
p = q;
}
p->next = head;
return head;
}
void link_process(node *head, int k,int m)
{
// 获取第k个节点
node *p = head, *prev = head;
// 找到头结点的前一个结点
while(prev->next != head)
prev = prev->next;
// 找到开始计数位置
while(p->data!=k)
p = p->next;
// 开始约瑟夫过程
while(p->next != p)
{
// count++;
for(int i=0;i<m-1;i++)
{
prev = p;
p = p->next;
}
// 删除当前结点
node* del = p;
// cout<<"del:"<<del->data<<endl;
prev->next = p->next; // the same with: prev->