题目一:https://www.luogu.com.cn/problem/B3631
思路:单向链表
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
struct Node{
int next;
int x;
}Nodes[N];
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b,c;
cin>>a;
if(a==1)
{
cin>>b>>c;
Nodes[c].next = Nodes[b].next;
Nodes[b].next = c;
}
if(a==2)
{
cin>>b;
cout<<Nodes[b].next<<endl;
}
if(a==3)
{
cin>>b;
Nodes[b].next = Nodes[Nodes[b].next].next;
}
}
return 0;
}
代码解释
(1)当a == 1时
data1 | next1 | → | date2 | next2 | → | date3 | next3 |
例如本来是1、3,在1后面添加2元素:
将1的next指向2的date域,将2赋值给1的next。
if(a==1)
{
cin>>b>>c;
Nodes[c].next = Nodes[b].next; //将b的next赋值给c的next
Nodes[b].next = c; //将c值赋值给b的next
}
(2)当a==2时,直接将后面一个数输出
if(a==2)
{
cin>>b;
cout<<Nodes[b].next<<endl;
}
(3)当a==3时,删除这个数后面的一个元素,直接将b的后继变为b后继的后继,跳过原先后面的数,得到结果。
if(a==3)
{
cin>>b;
Nodes[b].next = Nodes[Nodes[b].next].next;
}
题目二:P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:单向链表(介绍两种方法)
方法一:结构体数组实现单向静态链表
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
struct node{
int id,nextid;
}nodes[N];
int n,m;
int main()
{
cin>>n>>m;
nodes[0].nextid = 1;
for(int i = 1;i <= n;i++)
{
nodes[i].id = i;
nodes[i].nextid = i+1;
}
nodes[n].nextid = 1; //代表循环链表
int now = 1,prev = 1;
while((n--)>1)
{
for(int i = 1;i < m;i++)
{
prev = now;
now = nodes[now].nextid;
}
cout<<node[now].id<<" ";
nodes[prev].nextid = nodes[now].nextid; //删除当前这个now的值
now = nodes[prev].nextid;
}
cout<<nodes[now].nextid<<" "; //新的now
return 0;
}
方法二:一维数组实现单向静态链表
代码:
#include <bits/stdc++.h>
using namespace std;
int nodes[150];
int n,m;
int main()
{
cin>>n>>m;
for(int i = 1;i <= n-1;i++)
{
nodes[i] = i + 1;
}
nodes[n] = 1; //代表循环链表
int now = 1;
int prev = 1;
while((n--)>1)
{
for(int i = 1;i < m;i++) //到m个数就结束
{
prev = now;
now = nodes[now];
}
cout<<now<<" ";
nodes[prev] = nodes[now]; //跳过now节点
now = nodes[prev]; //新的now
}
cout<<now;
return 0;
}