5.16
双链表:
即有左节点右节点的链表
-
算法题中主要的声明方式:
-
int l[N],//向左边的结点 e[N],//存储的值 r[N],//右边的结点 idx;//变量指针 void init() { l[1] = 0; r[0] = 1; idx = 2;//初始有两个被占有,也导致后面找到k位置的值,他的实际下标变成了k+1; }
-
void add(int k, int x) { //在k位置的后面插入一个数; e[idx] = x;//idx先赋值 l[idx] = k; r[idx] = r[k]; //先将idx的左右两边指针指好,idx的左边是k位置,idx右边是原来k的右边 l[r[k]] = idx; //先找到原来k的右边,将他的左边变成新的idx位置 r[k] = idx; //这时候再去改变原来k右边的位置,变成新的idx idx++; //指针位置加加 }
-
void remove(int k) { //删除k位置的数; r[l[k]] = r[k]; //k的左边,找到之后,现在它的右边原来k的右边 l[r[k]] = l[k]; //k的右边,找到之后,现在它的左边原来k的左边 }
题目链接
https://www.acwing.com/problem/content/829/
-
#include "iostream" using namespace std; const int N = 100010; int l[N],//向左边的结点 e[N],//存储的值 r[N],//右边的结点 idx;//变量指针 void init() { l[1] = 0; r[0] = 1; idx = 2; } void add(int k, int x) { //在k位置的后面插入一个数; e[idx] = x; l[idx] = k; r[idx] = r[k]; l[r[k]] = idx; r[k] = idx; idx++; } void remove(int k) { //删除k位置的数; r[l[k]] = r[k]; l[r[k]] = l[k]; } int main() { int m; cin >> m; while (m--) { int k, x; string str; cin >> str; if (str == "L") { cin >> x; add(0, x); } else if (str == "R") { cin >> x; add(l[1], x); } else if (str == "D") { cin >> k; remove(k + 1); } else if (str == "IL") { cin >> k >> x; add(l[k + 1], x); //这里为什么用l[k+1]而不是k;因为现在每次实际第k个位置是k+1,那么找到他的左边就直接l[k+1]; } else if (str == "IR") { cin >> k >> x; add(k + 1, x);//同理这里找到k的位置,就是k+1; } for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << " "; return 0; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下