用数组模拟链表

十六.用数组模拟链表

如果用结构体和指针来实现链表,效率其实不如用数组,笔试题中很容易超时。

1.单链表

在笔试中用的最多的是邻接表。

邻接表的运用是存储图和树。

用数组来模拟,首先定义一个数组存储链表表示值的部分。可定义为value[N]或者e[N],用另一个数组表示指向下一个节点的指针可记为ne[N]。e和ne用下标关联起来。ne里面存的也是下标。如果下一个不存在则存-1

#include<iostream>
​
using namespace std;
​
const int N=100010;
//head表示头结点的下标
//e[i]表示节点i的值
//ne[i]表示节点i的next指针是多少
//idx存储当前已经用到了哪个点。如果要开新点,应该把inx指向的点赋值然后idx向后移一位
​
//初始化
void init(){
    head=-1;
    idx=0;
}
//将x插入到头节点
void add_to_head(int x){
    //先把要插入的节点的ne指向head的ne指向的节点,然后将head的ne指向该加入的节点
    e[idx]=x,ne[idx]=head,head=idx,idx++;
}
//一般操作,将x插到下标是k的点的后面
void add(int x,int k){
    e[idx]=x,ne[idx]=ne[k],ne[k]=idx,idx++;
}
//将下标是k的点的后面那个点删掉
void remove(int k){
    ne[k]=ne[ne[k]];
}

2.双链表

多用来优化某些问题。

跟单链表类似,不过他有两个指针,一个指向上一个节点,一个指向下一个。所以用l[N]和r[N]分别来储存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值