15074双链表-题解

题目描述:
实现一个双链表,双链表初始为空,支持5种操作:
1.在最左侧插入一个数;
2.在最右侧插入一个数;
3.将第k个插入的数删除;
4.在第k个插入的数左侧插入一个数;
5.在第k个插入的数右侧插入一个数;
现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。
1 ≤ M ≤ 100000

思路: 题目包含删除、插入等操作,且1 ≤ M ≤ 100000,所以要用数组模拟链表
由于后三种操作需要用到第k个数,所以要定义一个idx变量,用来存下次插入是第几个

*定义一个add(int k, int x),其中k是加入的编号,x是加入的值(在k之前插入x)

r[idx] = r[k];//插入(idx)的r为k的r
l[idx] = k;//idx的l为k
l[r[k]] = idx;//k的下一个的l为idx
r[k] = idx;//k的r为idx
e[idx] = x;//最后赋值
idx++;//别忘了下一个

*定义一个del(int k),k是删除的编号(删除k)

r[l[k]] = r[k];//k的上一个的r为k的r
l[r[k]] = l[k];// k的下一个的l为k的l

于是1 2 3 4 5操作都能表示出来:
0.初始化:将开头设为0号,将结尾设为1号

r[0] = 1;
l[1] = 0;
idx = 2;

1.在最左侧插入一个数:在0号节点前插入x,用add(0, x)

if (op == "L")
{
	cin >> x;
	add(0, x);
}

2.在最右侧插入一个数:在最后一个节点的后面插入x,就相当于在1号节点前插入x,用add(l[1], x)

if (op == "R")
{
	cin >> x;
	add(l[1], x);
}
  1. 将第k个插入的数删除:用del(k + 1)
if (op == "D")
{
	cin >> k;
	del(k + 1);
}
  1. 在第k个插入的数左侧插入一个数:在k+1的左侧插入x,用add(l[k + 1], x);
if (op == "IL")
{
	cin >> k >> x;
	add(l[k + 1], x);
}
  1. 在第k个插入的数右侧插入一个数:在k+1的右侧插入x, 用add(k + 1, x);
if (op == "IR")
{
	cin >> k >> x;
	add(k + 1, x);
}

最后是输出,用指针域遍历整个链表

for(int i = r[0]; i != 1; i = r[i])
{
	cout << e[i] << " ";
}
3 个赞

这个的话应该是在k之后插入x吧