《用数组模拟单链表》

137 阅读1分钟

模板

#include <bits/stdc++.h>

using i64 = long long;

int head = -1, idx = 0;//分别表示头节点的位置,当前这个点的位置。
std::vector<int> v(100000), ne(100000);//分别表示各个节点的值和其下一个点的位置。

void add_to_head(int x) {
	v[idx] = x;

	ne[idx] = head;
	head = idx ++;
}

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

	ne[idx] = ne[k];
	ne[k] = idx ++;
}

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

void solve() {
	char c;
	std::cin >> c;

	int k, x;

	if (c == 'H') {//在头节点后面添加一个节点。
		std::cin >> x;
		add_to_head(x);
	} else if (c == 'D') {//在第k个插入的数后删除一个节点。
		std::cin >> k;

		if (k == 0) {
			head = ne[head];//删除头节点。
		} else {
			remove(k - 1);
		}
	} else {//在第k个插入的数后添加一个节点。
		std::cin >> k >> x;
		add(k - 1, x);
	}
}

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

	int t;
	std::cin >> t;

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

	for (int i = head; i != -1; i = ne[i]) {//链表的遍历。
		std::cout << v[i] << " ";
	}

	return 0;
}