数据结构-链表
1.C++内存四区2.算法-排序-快速排序3.算法-排序-归并排序4.c++重载5.算法-二分6.算法—前缀和7.算法—差分8.算法-双指针9.c++引用10.c++函数默认参数及占位参数11.c++函数模板12.c++类和对象-封装13.struct和class的区别14.成员属性设置为私有15.C++类和对象-对象特性(1)16.C++类和对象-对象特性(2)17.N皇后18.动态规划dp-01背包问题19.C++类和对象-对象特性(4)20.C++类和对象-对象特性(3)21.C++友元22.C++运算符重载23.C++继承24.C++多态25.C++类模板26.C++vector容器27.C++string容器28.C++deque容器29.算法-树状数组30.算法线段树31.算法-bfs32.算法-贪心33.算法-Flood Fill
34.数据结构-链表
35.数据结构-栈36.数据结构-队列37.P2678 跳石头38.5132139.54440.3213241.牛客寒假算法集训1-总结42.牛客寒假算法集训2-总结43.牛客寒假算法集训3-总结44.数论-质数45.博弈论46.第十四届蓝桥杯省赛C++题解47.Trie树48.并查集49.数据结构-堆50.哈希表51.拓扑排序52.Dijkstra53.spfa54.数论-约数55.数论-欧拉函数56.图的存储和遍历57.牛客寒假算法集训4-总结58.牛客寒假算法集训5-总结59.牛客寒假算法集训6-总结60.Bellman_ford61.Floyd62.编辑距离63.数位dp1.单链表
作用:存储树和图。
思路:数组模拟链表,又称静态链表。
优点:速度快 动态链表慢的原因是每次都要new在堆区申请空间
AcWing-826
代码:
#include <iostream>
using namespace std;
const int N=1e5+10;
int head;//头节点下标
int idx//存储当前用的哪个节点
int e[N];//数值
int ne[N];//指针域 存储下一个节点(下标)
int m;//操作次数
void init()//初始化
{
head=-1;//初始空集
idx=0;//表头为空
}
void add_to_head(int x)//表示向链表头插入一个数 x
{
e[idx]=x;//存储节点的值
ne[idx]=head;//存储下一点的下标
head=idx;//让头节点指向新插入的点
idx++;//更新表头
}
void remove(int k)//表示删除下标为k后面的数
{
ne[k]=ne[ne[k]];//让第k个数的指针直接指向第k+2个数的下标,起到删除k+1个数的作用
}
void add(int k,int x)//表示在下标为k的数后面插入一个数 x
{
e[idx]=x;//存储节点的值
ne[idx]=ne[k];//将下标为k的指针赋给新插入的指针域里
ne[k]=idx;//让下标为k的指针指向新数下标
idx++;//更新表头
}
int main()
{
cin>>m;
init();//初始化
while(m--)//操作
{
char c;
cin>>c;
if(c=='H')
{
int x;cin>>x;
add_to_head(x);
}
else if(c=='D')
{
int k;
cin>>k;
if(k==0) head=ne[head];
else remove(k-1);//注意下标
}
else
{
int k,x;
cin>>k>>x;
add(k-1,x);//注意下标
}
}
for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<' ';//输出
return 0;
}
2.双链表
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int m;
int l[N];//每个点左面的点
int r[N];//每个节点右面的点
int e[N];//节点值
int idx;//当前用的下标
void init()
{
l[1]=0;//右侧端点
r[0]=1;//左侧端点
idx=2;
}
void add(int k,int x)//在第k个数右边插入一个数
{
e[idx]=x;//存储节点的值
r[idx]=r[k];//指向原先第k的数的右面的点
l[idx]=k;//idx左边
l[r[k]]=idx;//k+1左端点指向插入点
r[k]=idx;//k 右端点指向插入点
idx++;//更新表头
}
void remove(int k)//删除第k个数
{
r[l[k]]=r[k];//k的左面点指向k右面点
l[r[k]]=l[k];//k右面点指向k左面点
}
int main()
{
cin>>m;
int x,k;
init();//初始化
while(m--)//操作
{
string c;
cin>>c;
if(c=="L")
{
cin>>x;
add(0,x); //最左端
}
else if(c=="R")
{
cin>>x;
add(l[1],x);//最右端
}
else if(c=="D")
{
cin>>k;
remove(k+1);//因为idx从2开始 所以第k个插入的点的下标是k+1
}
else if(c=="IL")
{
cin>>k>>x;
add(l[k+1],x);
}
else
{
cin>>k>>x;
add(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' ';//输出
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析