《用数组模拟双链表》

131 阅读1分钟

模板

#include <bits/stdc++.h>

using i64 = long long;

std::vector<int> v(100000), l(100000), r(100000);//分别表示值,左边的位置,右边的位置。
int idx;//表示当前的位置

void add(int k, int x) {
	v[idx] = x;
	r[idx] = r[k];

	l[idx] = k;
	l[r[k]] = idx;

	r[k] = idx ++;
}

void remove(int k) {
	r[l[k]] = r[k];
	l[r[k]] = l[k];
}

void solve() {
	std::string ss;
	std::cin >> ss;

	int k, x;

	if (ss == "IR") {//在第k个插入的数右边添加一个节点。
		std::cin >> k >> x;
		add(k + 1, x);
	} else if (ss == "IL") {//在第k个插入的数左边添加一个节点。
		std::cin >> k >> x;
		add(l[k + 1], x);
	} else if (ss == "D") {//删除第k个数。
		std::cin >> k;
		remove(k + 1);
	} else if (ss == "R") {//在链表的最右端添加一个节点。
		std::cin >> x;
		add(l[1], x);
	} else {//在链表的最左端添加一个节点。
		std::cin >> x;
		add(0, x);
	}
}

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int m;
	std::cin >> m;

	r[0] = 1, l[1] = 0;//初始化0表示左端点,1表示右端点。
	idx = 2;//0和1已经被占用过了。

	while (m --) {
		solve();
	}

	for (int i = r[0]; i != 1; i = r[i]) {
		std::cout << v[i] << " ";
	}

	return 0;
}