单链表
下面展示一些
内联代码片
。
来自acwing,826号题
#include<iostream>
using namespace std;
const int N =100010;
// head 表示头结点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针是多少
// idx 存储当前已经用到了哪个点
int head ,e[N] ,ne[N] ,idx;
//初始化
void inti(){
head =-1;
idx=0;
}
//插到head节点后
void add_to_head(int x){
e[idx] = x ;//先赋值
ne[idx] = head ;//让他指向head的下一位
head = idx++ ;//再让head指向idx
}
//普通的插入
void add (int k,int x){//将x插到k节点后
e[idx] =x;
ne[idx] =ne[k];
ne[k] =idx++;
}
//删除第k点的下一个点
void remove(int k){
ne[k] =ne [ne[k]];
}
int main(){
ios::sync_with_stdio(0);
int n;
cin>>n;
inti();
for(int i=0;i<n;i++){
char a;
cin>>a;
if(a == 'H'){
int x;
cin>>x;
add_to_head(x);
}
else if(a=='D'){
int k;
cin>>k;
if(!k) head =ne[head];
remove(k-1);// k-1, 因为0号点是第一个插入的点
}
else if(a == 'I'){
int k,x;
cin>>k>>x;
add(k-1,x);// k-1, 因为0号点是第一个插入的点
}
}
for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';//输出方式
cout << endl;
}
双链表
下面展示一些
内联代码片
。
来自acwing,827号题
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N =100010;
int e[N],l[N],r[N],idx;
//初始化
void inti(){
r[0]= 1;
l[1]= 0;
idx=2;
}
//在下标为 k 的节点后面 插入一个数 x,
void add(int k,int x){
e[idx] = x;//经典的先赋值
r[idx] = r[k];//连右方向
l[idx] = k;//连左方向
l[r[k]] = idx;//先搞这个不然r[k]会先变
r[k] = idx;
idx++;
}
//删除下标为 k 的节点 后一个数
void remove(int k){
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main(){
ios::sync_with_stdio(0);
inti();
int n,x,k;
cin>>n;
while(n--){
string a;
cin>>a;
if(a=="L"){
cin>>x;
add(0,x);//最左即为最前,0为开始,所以插到右边,0,1不算双链表的值
}
else if(a=="R"){
cin>>x;
add(l[1],x);//插到尾巴前面,所以不是0
}
else if(a=="D"){
cin>>k;
remove(k+1);//角标从2开始的所以第k个的角标为k+1
}
else if(a=="IL"){
cin>>k>>x;
add(l[k+1],x);
}
else if(a=="IR"){
cin>>k>>x;
add(k+1,x);
}
}
for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
}