- 1. 题目
- 2. 读题(需要重点注意的东西)
- 3. 解法
- 4. 可能有帮助的前置习题
- 5. 所用到的数据结构与算法思想
- 6. 总结
初步思路:结构体和指针的方法,面试常用,但是笔试不常用的方法。原因是每次都要new一个新Node,太慢了。
因此在本文中使用静态链表,即用数组模拟链表。
-
初始化
注意,idx是从2开始的
-
插入操作
在k节点的左侧插入相当于从k节点的左侧节点的右侧插入!即:
-
删除操作
---------------------------------------------------解法---------------------------------------------------
#include4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结using namespace std; const int N = 1e5+10; int e[N],l[N],r[N],idx; int k,x,m; void init(){ r[0] = 1; l[1] = 0; idx = 2; } // 在节点下标为k的节点的右边插入一个数x void insert(int k,int x){ e[idx] = x; l[idx] = k; r[idx] = r[k]; l[r[k]] = idx; r[k] = idx; idx ++; } // 删除下标为k的节点 void remove(int k){ r[l[k]] = r[k]; l[r[k]] = l[k]; } int main(){ init(); cin >> m; while(m--){ string op; cin >> op; // 在头结点插值是在0的右边插入 if(op == "L"){ cin >> x; insert(0,x); } // 在尾端插是在1的左边插 else if(op == "R"){ cin >> x; insert(l[1],x); } // 将第 k 个插入的数删除,第 k 个插入的数下标为k+1, else if(op == "D"){ cin >> k; remove(k+1); } else if(op == "IL"){ cin >> k >> x; insert(l[k+1],x); } else if(op == "IR"){ cin >> k >> x; insert(k+1,x); } } // 注意:从r[0]开始遍历 for(int i = r[0];i != 1;i = r[i]) cout << e[i] << " "; cout << endl; return 0; }
双链表用静态数组实现模板题,推荐完全背下来。


![[AcWing]827. 双链表(C++实现)双链表模板题 [AcWing]827. 双链表(C++实现)双链表模板题](http://www.mshxw.com/aiimages/31/429648.png)
