用数组模拟链表

零 前言

为什么放着现成的不用,要用数组来模拟链表?

原因是:这样相当于自己做了一个内存池,可以避免内存泄漏而且方便调试。更深一点来说,数组的存储位置集中,有利于提高Cache命中率。

当然,最重要的是效率原因。算法题中的数据大多十万到百万级别,如果用 new 的方法,很容易TL也就是超时。

所以掌握用数组模拟链表的方法很重要,本篇主要讲述单链表和双链表的模拟。

提示:本文为C++实现,但所有语言通用,会省略部分与实现无关的代码。会跳过一些基础概念,不了解百度即可,咱们直接看实现 ❤

一 单链表

image-20210823231503911

实现

我们使用 ene 数组分别存储数据和指针,同时初始化 headidx

const int N = 100010// 定义常量

// e[i]表示结点i的值
// ne[i]表示结点i的next指针的指向
// head表示头结点的下标,初始为-1
// idx存储当前用到了哪个结点,也可看作指针
int e[N], ne[N],head = -1, idx;	

img

然后就是实现基础操作插入和删除

// 头插法:将x插到头结点
void insert_head(int x) {
   
    e[idx] = x;
    ne[idx] = head;	// 1.将x项指向原先的头结点
    head = idx;		// 2.x项为新的头结点
    idx++;
}

// 普通插入(与头插类似):在第k个插入的数后面插入x项,k从0开始(下同)
// 先将x项指向k项的后一项,再让k项指向x项
void insert(int k, int x) {
   
    e[idx] = x, ne[idx] = ne[k], ne[k] = idx++
  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mancuoj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值