链表
链表
链表包括单链表和双链表,单链表可以用于存图、树,双链表可以优化问题。
单链表:指针单向
双链表:指针双向
一.单链表
考点:单链表的增删
第k个插入的点,下标k-1
单链表:
//单链表
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int e[N];
int ne[N];
int idx;
int head;//头指针
//头插
void add_head(int x) {
e[idx]=x;
ne[idx]=head;
head=idx++;
}
//指定位置插入
void insert(int k,int x) {
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx++;
}
//指定位置删除
void drop(int k){
ne[k] =ne[ne[k]];
}
int main(){
head=-1;
int m;
cin>>m;
char op;//操作符
int k,x;//位置k,插入数x
while(m--){
cin>>op;
if(op=='H'){
//头插
cin>>x;
add_head(x);
}
else if(op=='I'){
//第k个插入数后插入数字
cin>>k>>x;
insert(k-1,x);
}
else if(op=='D') {
//第k个插入数后删除
//删除注意删除第一个点
cin>>k;
if(k!=0){drop(k-1);
}
else{
head=ne[head];
}
}
}
for(int i=head;i!=-1;i=ne[i]){
cout<<e[i]<<" ";
}
return 0;
}
二.双链表
双链表
//双链表
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int l[N];
int r[N];
int e[N];//存放指定位置的数值
int idx;
//初始化
void init() {
//下标0用于存头,下标1存尾
idx=2;
r[0]=1;
l[1]=0;
}
void left_head(int x){//最左端插入
e[idx] =x;
l[idx]=l[r[0]];
r[idx]=r[0];
l[r[0]] =idx;
r[0]=idx++;
}
//最右端插入
void right_head(int x){
e[idx]=x;
//新插入数指针
l[idx]=l[1];
r[idx]=r[l[1]];
//修改原来指针
r[l[1]]=idx;
l[1]=idx++;
}
//删除
void drop(int k) {
int t=r[k];
r[l[k]]=r[k];
l[t]=l[k];
}
//第k个数左侧插入
void insert_left(int k,int x) {
e[idx]=x;
r[idx]=r[l[k]];
l[idx]=l[k];
r[l[k]]=idx;
l[k]=idx++;
}
//第k个数右边插入
void insert_right(int k,int x) {
e[idx]=x;
r[idx]=r[k];
l[idx]=l[r[k]];
l[r[k]]=idx;
r[k] =idx++;
}
int main(){
int m;
cin>>m;
string op;
int k,x;
init();
while(m--){
cin>>op;
if(op=="L"){
cin>>x;
left_head(x);
}
else if(op=="R"){
cin>>x;
right_head(x);
}
else if(op=="D"){
cin>>k;
drop(k+1);
}
else if(op=="IL"){
cin>>k>>x;
insert_left(k+1,x);
}
else if(op=="IR"){
cin>>k>>x;
insert_right(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i]){
cout<<e[i]<<" ";
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步