用数组来模拟单链表和双链表(有注释)

单链表


下面展示一些 内联代码片

来自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] << ' ';
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值