数组模拟单链表(C++实现)

学习视频:acwing算法基础课

何为单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。————百度百科

~感觉看着有点复杂~

个人感觉单链表就是将数据通过指针链接起来

比如数组里存储1 2 3 4 画出来是这样的

 那么链表里存储1 2 3 4画出来就是这样的【这里next指针意为指向下一个结点(数据和指针称为结点)的指针】

那么如何用数组表示单链表呢

定义一个e[ ]用于存储每个结点的值

定义一个ne[ ]用于存储每个结点的next指针

e[ ]和ne[ ]通过下标联系起来  比如将此链表用数组表示

代码实现

1.准备

#include<iostream>
using namespace std;

const int N = 100005;//数组最大元素个数


//head表示头节点(第一个结点)的下标   因为可能会在第一个结点前进行插入所以需要有一个
//e[]用于存储结点的值
//ne[]用于存储结点的next指针(下一个结点的下标)
//idx指针指向下一个待插入元素插入的位置
int head, e[N], ne[N],idx;

e[ ]:用于存储每个结点的值

ne[ ]:用于存储每个结点的next指针

head:存储第一个结点的下标,还未插入第一个结点时置为-1。

我们在进行插入操作时可能会在链表开头插入节点比如

 在此链表第一个节点前插入1,则链表变为

 此时头节点应为 1 ,头节点发生变化 所以需要有一个指针指向头结点

idx:指向下一个待插入元素的位置

还是这个链表

 下一个结点应插入在数组下标为5的位置。为了方便插入操作,用idx保存插入的位置

2.初始化

void init()
{
	head = -1;//-1表示NULL
	idx = 0;//从下标为0的地方开始插入
}

初始化时链表里没有任何数据(当然也没有头节点)所以head应指向NULL,head=-1

第一个数据应从下标为0的地方开始插入,所以idx=0

3.将新结点x插入到头节点的位置

               eg:将1插入到头节点的位置

        第一步:

                让1结点的next指针指向头节点

         第二步:

                 让head指针指向新节点

//将x插到头节点
void add_to_head(int x)
{
	e[idx] = x;//将x存入e
	ne[idx] = head;//x的next指针指向头节点
	head = idx;//head指向新结点
	idx++;//idx右移一位以方便下一次插入
}

4.将新结点x插入到下标为k的结点的后面

                eg:将1插入到下标为2的结点后面

        第一步:

                 将新结点的next指针指向 下标为2的结点 的下一个结点

        第二步:

                 下标为2的结点的next指针指向新节点

//将新结点x插入到下标为k的结点的后面
void add(int x, int k)
{
    e[idx] = x;//将x存入e
    ne[idx] = ne[k];//新节点的next指针指向下标为k的结点的下一个结点
    ne[k] = idx;//下标为k的结点的next指针指向新节点
    idx++;//idx后移一位
}

5.将下标为k的点后面的点删掉

        eg:删掉下标为2的点后面的点

        第一步:

                 让下标为2的点的next指针 指向 下标为2的点的下一个结点的下一个结点

//将下标为k的点后面的点删掉
void remove(int k)
{
	ne[k] = ne[ne[k]];
}

向链表表头插入数据5

向链表表头插入数据4

在下标为1的数后面插入3

在下标为1的数后面插入9

删除下标为1的结点后面的数

#include<iostream>
using namespace std;

const int N = 100005;//数组最大元素个数


//head表示头节点(第一个结点)的下标   因为可能会在第一个结点前进行插入所以需要有一个
//e[]用于存储结点的值
//ne[]用于存储结点的next指针(下一个结点的下标)
//idx指针指向下一个待插入元素插入的位置
int head, e[N], ne[N],idx;


//初始化
void init()
{
	head = -1;//-1表示NULL
	idx = 0;//从下标为0的地方开始插入
}

//将x插到头节点
void add_to_head(int x)
{
	e[idx] = x;//将x存入e
	ne[idx] = head;//x的next指针指向头节点
	head = idx;//head指向新结点
	idx++;//idx右移一位以方便下一次插入
}

//将新结点x插入到下标为k的结点的后面
void add(int x, int k)
{
	e[idx] = x;//将x存入e
	ne[idx] = ne[k];//新节点的next指针指向下标为k的结点的下一个结点
	ne[k] = idx;//下标为k的结点的next指针指向新节点
	idx++;//idx后移一位
}

//将下标为k的点后面的点删掉
void remove(int k)
{
	ne[k] = ne[ne[k]];
}

int main()
{
	init();
	add_to_head(5);
	add_to_head(4);
	add(3, 1);
	add(9, 1);
	remove(1);

	for (int i = head; i != -1; i = ne[i])
	{
		cout << e[i];
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值