磊磊零基础打卡算法:day12 c++静态单链表
作者:互联网
5.15
静态单链表
简单的方法:
成员变量:
int e[N],//存放节点的值
ne[N],存放结点的next
head,头结点指针
idx;变化的指针
-
初始化:
-
void init() { head = -1;//头结点最初指向-1 idx = 0;//初始的位移指针是0; } //初始化链表
-
-
在头部位置添加:
-
void add_to_head(int x) { e[idx] = x, ne[idx] = head, head = idx++; } //将x的值存在idx位置,将idx的下一个指向head结点,然后将idx,head指针变化位置,最后一步先赋值再加加;经典的头插法
-
-
在任意位置插入
-
void add(int k, int x) { //插入k后面的位置 e[idx] = x, ne[idx] = ne[k], ne[k] = idx++; }//原理与在头部位置插入一样
-
-
删除某个位置的结点:
-
void remove(int k) { //删除k结点的后一个结点 ne[k] = ne[ne[k]]; //头结点的下一位,变成头结点的下一位的下一位,就相当于删除了k位置的结点 }
-
例题
链接:
https://www.acwing.com/problem/content/828/
ps:自己画的图有点小丑,见谅
#include "iostream"
using namespace std;
const int N = 100010;
int head, e[N], ne[N], idx;
void init() {
head = -1;
idx = 0;
} //初始化链表
void add_to_head(int x) {
e[idx] = x, ne[idx] = head, head = idx++;
} //将x的值存在idx位置,将idx的下一个指向head结点,然后将idx,head指针变化位置,经典的头插法
void add(int k, int x) { //插入k后面的位置
e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;
}
void remove(int k) { //删除k结点的后一个结点
ne[k] = ne[ne[k]];
}
int main() {
int m;
cin >> m;
init();
while (m--) {
int k, x;
char p;
cin >> p;
if (p == 'H') {
cin >> x;
add_to_head(x);
} else if (p == 'D') {
cin >> k;
if (!k)
head = ne[head];
else
remove(k - 1);
} else {
cin >> k >> x;
add(k - 1, x);
}
}
for (int i = head; i != -1; i = ne[i])
//判断结束的位置其实是head=-1,也就是最开始的位置,i每次变化指针位置,指向下一个;
cout << e[i] << " ";
return 0;
}
标签:head,idx,int,结点,ne,c++,磊磊,打卡,void 来源: https://www.cnblogs.com/gwl999/p/16273833.html