【算法模板】数组模拟单链表

 

目录

1.引言

2.思路介绍

3.代码实现

3.结语


1.引言

为什么要用数组来模拟实现单链表?因为链表的实现(new)是一个十分慢的过程,因此,我们在算法题中常用数组来模拟实现链表,栈,队列等数据结构,以空间换时间,提高程序运行的速率。

2.思路介绍

 我们知道一般链表的思路是这样的

 需要用到的是一个变量存数据,一个变量存地址。

那仔细思考一下,我们是不是也可以用两组数组来实现这个结构呢!

int e[N];  存放值

int ne[N];   存放下标

通过数组ne来找到e中每个值对应的下标,是不是就有了一个一一对应的关系?

那又有一个新问题出现,如何实现插入,删除等操作呢???

3.代码实现

 结合一道题目来解释

 

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
//ne[]存放下标,模拟next指针 
int e[N],ne[N];

//idx模拟为创建的结点,idx的值为对应结点的下标,以及虚拟创建的结点个数。
int idx = 1;

//ne[0]模拟头指针

//插入结点模拟
void insert_back(int k,int x)
{
    e[idx]=x,ne[idx]=ne[k],ne[k]=idx++;
    //1.先存入插入的值
    //2.同时新结点存储下一个结点对应的下标
    //3.修改新结点的上一个结点 存储新结点的下标
    //4.idx++以便下一次存储新节点的值与指向结点的下标
}

//删除结点模拟
void dele_back(int k)
{
    //ne[k]意为第k个结点指向的下一个结点的下标
    //将第k个结点储存的下标跳过那个要删的结点指向其后第二位的结点
    //比如0->1->2,数组ne中ne[k]=1,ne[ne[k]]=2
    ne[k]=ne[ne[k]];
}

int main()
{
    int M;
    scanf("%d",&M);
    while(M--)
    {
        char input;
        int k,x;
        scanf("\n%c",&input);
        switch(input)
        {
            case 'H':
            scanf("%d",&x);
            insert_back(0,x);
            break;

            case 'D':
            scanf("%d",&k);
            dele_back(k);
            break;

            case 'I':
            scanf("%d%d",&k,&x);
            insert_back(k,x);
            break;
        }
    }
    
    for(int j = ne[0];j;j=ne[j])
    {
        printf("%d ",e[j]);
    }
    return 0;
}

 请结合代码,手动画图来理解具体的思想,这样会很快明白!!!

3.结语

数据模拟实现单链表的内容已经结束了,主要是当做一个算法模板,以便写题时快速上手使用。

同时也能加深对链表的理解。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laxinues

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值