数组实现双链表
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组实现双链表相关的知识,希望对你有一定的参考价值。
实现一个双链表,双链表初始为空,支持5种操作:
(1) 在最左侧插入一个数;
(2) 在最右侧插入一个数;
(3) 将第k个插入的数删除;
(4) 在第k个插入的数左侧插入一个数;
(5) 在第k个插入的数右侧插入一个数
现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。
输入格式
第一行包含整数M,表示操作次数。
接下来M行,每行包含一个操作命令,操作命令可能为以下几种:
(1) “L x”,表示在链表的最左端插入数x。
(2) “R x”,表示在链表的最右端插入数x。
(3) “D k”,表示将第k个插入的数删除。
(4) “IL k x”,表示在第k个插入的数左侧插入一个数。
(5) “IR k x”,表示在第k个插入的数右侧插入一个数。
输出格式
共一行,将整个链表从左到右输出。
数据范围
1≤M≤100000
所有操作保证合法。
输入样例:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
输出样例:
8 7 7 3 2 9
定义:
e[N]:存放结点的val
l[N]:存放结点的左边值
r[N]:存放结点的右边值
idx:索引结点
初始化:让0的右边为1,一的左边为0,即让头指针表示为0,让尾指针表示为1,则index从2开始。
1 void init() 2 { 3 r[0] = 1; 4 l[1] = 0; 5 idx = 2; 6 }
题目中的各种insert操作:我们可以让它们都转化成插入在一个结点的右边(通过传入参数控制)。
1 void insert(int k, int x) 2 { 3 e[idx] = x; //接收值 4 r[idx] = r[k]; //新插入结点的右边指向第k个结点的右边结点 5 l[idx] = k; //新插入结点的左边指向第k个结点 6 l[r[k]] = idx; //第k个结点的右边结点的左边指向新插入结点 7 r[k] = idx; //第k个结点的右边指向新插入结点 8 idx++; 9 }
删除操作:
1 void remove(int k) 2 { 3 r[l[k]] = r[k]; //k的左边结点的右边指向k的右边 4 l[r[k]] = l[k]; //k的右边结点的左边指向k的左边 5 }
总代码,注意插入时传参(因为idx从2开始,所以第k个结点的下标时k+1):
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 const int N = 100010; 6 int e[N], l[N], r[N], idx; 7 8 void init() 9 { 10 r[0] = 1; 11 l[1] = 0; 12 idx = 2; 13 } 14 15 void insert(int k, int x) 16 { 17 e[idx] = x; 18 r[idx] = r[k]; 19 l[idx] = k; 20 l[r[k]] = idx; 21 r[k] = idx; 22 idx++; 23 } 24 25 void remove(int k) 26 { 27 r[l[k]] = r[k]; //k的左边结点的右边指向k的右边 28 l[r[k]] = l[k]; //k的右边结点的左边指向k的左边 29 } 30 31 int main() 32 { 33 int m; 34 35 init(); 36 37 cin >> m; 38 while(m--) 39 { 40 string op; 41 cin >> op; 42 int k, x; 43 44 if(op == "L") 45 { 46 cin >> x; 47 insert(0, x); 48 } 49 else if(op == "R") 50 { 51 cin >> x; 52 insert(l[1], x); 53 } 54 else if(op == "D") 55 { 56 cin >> k; 57 remove(k+1); //因为idx = 2是第一个结点 所以第k个结点时k+1 58 } 59 else if(op == "IL") 60 { 61 cin >> k >> x; 62 insert(l[k+1], x); 63 } 64 else if(op == "IR") 65 { 66 cin >> k >> x; 67 insert(k+1, x); 68 } 69 } 70 71 for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << " "; 72 cout << endl; 73 system("pause"); 74 return 0; 75 }
以上是关于数组实现双链表的主要内容,如果未能解决你的问题,请参考以下文章