用数组来模拟单链表和双链表

简介: 用数组来模拟单链表和双链表

单链表

//head 表示头结点的下标
//e[i]表示结点i的下标
//ne[i]表示结点i的next指针是多少
//idx存储当前已经用到那个点//每个变量表示的意思

首先是初始化

void init() {
    head = -1;
    idx = 0;
}

然后是将x插入到头结点

void add_to_head(int  x) {
    e[idx] = x;//现将x存起来
    ne[idx] = head;//把指针存进ne这个数组里面
    head = idx;//更新头结点
    idx++;
}

接着实现将x插入到下标是k的点的后面

void add(int k, int x) {
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}

最后就是来实现将下标是k的点后面的数删除

void remove(int k) {
    ne[k] = ne[ne[k]];//这个地方很巧妙
}

通过以上方法就可以数组实现单链表的各种功能用数组实现单链表的一个题

双链表

首先就是初始化

void init(){//由于才开始是0,1
    r[0]=1;//让0的右边是1
    l[1]=0;//1的左边是0
    idx=2;//idx初始值就是2
}

然后就是插入操作这需要自己动手画图来理解以下是我自己

画的图。

void insert(int k,int x){
    e[idx]=x;//首先存进数值
    l[idx]=k;//左边是k
    r[idx]=r[k];//右边是k的右边
    l[r[k]]=idx;//k右边的左边是idx
    r[k]=idx++;//k的右边是也是idx
}

通过该操作就可以把下标为k的数的右边插入x

接着就需要实现删除操作

void remove(int k){
    l[r[k]]=l[k];//k右边的左边等于左边
    r[l[k]]=r[k];//k左边的右边等于右边
}

通过该操作就可以实现将下标是k的数删除

通过以上操作用数组来实现双链表的各种操作用数组实现双链表的一个题


相关文章
【数据结构】数组、双链表代码实现
【数据结构】数组、双链表代码实现
|
3天前
|
存储 Android开发 算法
Android技能树 — 数组,链表,散列表基础小结,android教程零基础入门
Android技能树 — 数组,链表,散列表基础小结,android教程零基础入门
|
5天前
特殊链表(循环单链表,循环双链表,静态链表)
特殊链表(循环单链表,循环双链表,静态链表)
13 3
|
5天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
12 0
|
5天前
|
缓存 算法 搜索推荐
【数据结构】链表(单链表与双链表实现+原理+源码)
【数据结构】链表(单链表与双链表实现+原理+源码)
|
5天前
|
存储 算法
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
24 0
|
5天前
|
Java Go C++
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
30 0
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
|
5天前
|
Java Go C++
Golang每日一练(leetDay0116) 路径交叉、回文对
Golang每日一练(leetDay0116) 路径交叉、回文对
32 0
Golang每日一练(leetDay0116) 路径交叉、回文对
|
5天前
|
算法 C++ Python
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
31 0
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
|
5天前
|
Python Java Go
Python每日一练(20230430) 移除元素、删除排序链表中的重复元素、搜索旋转排序数组II
Python每日一练(20230430) 移除元素、删除排序链表中的重复元素、搜索旋转排序数组II
51 0
Python每日一练(20230430) 移除元素、删除排序链表中的重复元素、搜索旋转排序数组II