【算法基础课】 数据结构 1


回来复习了
以下几个都以数组模拟为主
效率问题,效率高

链表和邻接表 : 树与图的存储

数组模拟单链表

在这里插入图片描述

用e[N]来表示每个点的数值,用ne[N] 来表示每个点的next指针是多少。
e和ne是通过下标结合起来的
于是这个链表的表达式就是:
在这里插入图片描述

插入x到头结点的位置

插入一个点到头结点

将x插入第k个点后面

将x插入第k个点后面

将第k 个点的后面的数删除

将第k 个点的后面的数删除

代码

#include <bits/stdc++.h>

using namespace std;
const int N = 100010;

int head, e[N], ne[N], idx; // head 是头结点下标 , idx是个指针,表示我们当前用到了哪个点 
 
// 链表初始化
void init()
{
	head = -1;
	idx = 0;
	
} 
//将x插到头结点 
void add_to_head(int x)
{
	e[idx] = x;
	ne[idx] = head;
	head = idx;
	idx ++;
} 
// 将x插入k点后面
void add_to_k(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]];
} 

数组模拟双链表

作用:优化
用l[N]表示某个点左边的点,r[N]表示某个点右边的点
偷个小懒
将head 表示成 第0个点
将tail 表示成最后一个点
双链表示意图

栈与队列 : 单调队列 单调栈

之后再补充

KMP

之后再补充

习题

AcWing 826.单链表

AcWing 826.单链表

#include <bits/stdc++.h>

using namespace std;
const int N = 100010;
int head, idx, e[N], ne[N];
int M;
char a;
void init()
{
    head = -1;
    idx = 0;
    
}
void add_to_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx ++;
    
    
}
void add_to_k(int k, int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx ++;
}
void remove(int k)
{
    ne[k] = ne[ne[k]];
}
int main()
{
    cin >> M;
    init();
    while(M --)
    {
        int k, x;
        char op;
        cin >> op;
    
        
        if (op == 'H')
        {
            cin >> x;
            add_to_head(x);
        }
        else if(op == 'D')
        {
            cin >> k;
            if(k == 0) head = ne[head];
            else remove(k - 1);
        }
        else
        {
            cin>> k >> x;
            add_to_k(k - 1, x);
        }
    }
    for(int i = head; i != -1; i = ne[i]) cout << e[i] << " ";
    cout << endl;
    return 0;
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值