学习视频: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];
}
}