数据结构-链表

1.单链表

作用:存储树和图。
思路:数组模拟链表,又称静态链表。
优点:速度快 动态链表慢的原因是每次都要new在堆区申请空间
AcWing-826

代码:

#include <iostream>

using namespace std;

const int N=1e5+10;

int head;//头节点下标
int idx//存储当前用的哪个节点
int e[N];//数值
int ne[N];//指针域 存储下一个节点(下标)
int m;//操作次数

void init()//初始化
{
    head=-1;//初始空集
    idx=0;//表头为空
}
void add_to_head(int x)//表示向链表头插入一个数 x
{
    e[idx]=x;//存储节点的值
    ne[idx]=head;//存储下一点的下标
    head=idx;//让头节点指向新插入的点
    idx++;//更新表头
}

void remove(int k)//表示删除下标为k后面的数
{
    ne[k]=ne[ne[k]];//让第k个数的指针直接指向第k+2个数的下标,起到删除k+1个数的作用
}

void add(int k,int x)//表示在下标为k的数后面插入一个数 x
{
    e[idx]=x;//存储节点的值
    ne[idx]=ne[k];//将下标为k的指针赋给新插入的指针域里
    ne[k]=idx;//让下标为k的指针指向新数下标
    idx++;//更新表头
}

int main()
{
    cin>>m;
    init();//初始化
    while(m--)//操作
    {   
        char c;
        cin>>c;
        if(c=='H')
        {
            int x;cin>>x;
            add_to_head(x);
        }
        else if(c=='D')
        {
            int k;
            cin>>k;
            if(k==0) head=ne[head];
            else remove(k-1);//注意下标
        }
        else
        {
            int k,x;
            cin>>k>>x;
            add(k-1,x);//注意下标
        }
    }
    
    for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<' ';//输出
    return 0;
}

2.双链表

AcWing-827

代码:

#include <bits/stdc++.h>

using namespace std;

const int N=1e5+10;
int m;
int l[N];//每个点左面的点
int r[N];//每个节点右面的点
int e[N];//节点值
int idx;//当前用的下标

void init()
{
    l[1]=0;//右侧端点
    r[0]=1;//左侧端点
    idx=2;
}

void add(int k,int x)//在第k个数右边插入一个数
{
    e[idx]=x;//存储节点的值
    r[idx]=r[k];//指向原先第k的数的右面的点
    l[idx]=k;//idx左边
    l[r[k]]=idx;//k+1左端点指向插入点
    r[k]=idx;//k 右端点指向插入点
    idx++;//更新表头
}

void remove(int k)//删除第k个数
{
    r[l[k]]=r[k];//k的左面点指向k右面点
    l[r[k]]=l[k];//k右面点指向k左面点
}

int main()
{
    cin>>m;
    int x,k;
    init();//初始化
    while(m--)//操作
    {
        string c;
        cin>>c;
        if(c=="L")
        {
            cin>>x;
            add(0,x);  //最左端
        }
        else if(c=="R")
        {
            cin>>x;
            add(l[1],x);//最右端
        }
        else if(c=="D")
        {
            cin>>k;
            remove(k+1);//因为idx从2开始 所以第k个插入的点的下标是k+1
        }
        else if(c=="IL")
        {
            cin>>k>>x;
            add(l[k+1],x);
        }
        else
        {
            cin>>k>>x;
            add(k+1,x);
        }
    }
    
    for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' ';//输出
    
    return 0;
}
posted @   Eric`  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示