2.双链表

Posted fx1998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.双链表相关的知识,希望对你有一定的参考价值。

技术图片

 技术图片

 技术图片

 双链表一个节点里面有两个指针,一个指向左边,一个指向右边

不定义头结点和尾结点了

令下标是0的点表示head

令下标是1的点表示tail

邻接表的知识:把每个点的所有邻边全部存下来

邻接表就是n个单链表

head[i]存储第i个点的邻边

技术图片

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100010;
 4 int e[N], l[N], r[N], idx;
 5 //l[i]存储i这个点左边是谁
 6 //r[i]存储i这个点右边是谁
 7 //初始化
 8 void init() {
 9     r[0] = 1;
10     l[1] = 0;
11     idx = 2; //因为0和1已经用过了
12 } 
13 //在下标是k的节点右边插入值为x的节点
14 void add(int k, int x) {
15     e[idx] = x;
16     r[idx] = r[k];
17     l[idx] = k;
18     l[r[k]] = idx;
19     r[k] = idx;
20     idx++;
21 } 
22 //删除下标为k的节点
23 void remove(int k) {
24     r[l[k]] = r[k];
25     l[r[k]] = l[k];
26 }
27 int main() {
28     init();
29     int m;
30     cin >> m;
31     while (m--) {
32         string s;
33         int k, x;
34         cin >> s;
35         if (s == "L") {
36             cin >> x;
37             add(0, x);
38         } else if (s == "R") {
39             cin >> x;
40             add(l[1], x);
41         } else if (s == "D") {
42             cin >> k;
43             remove(k + 1);
44         } else if (s == "IL") {
45             cin >> k >> x;
46             add(l[k + 1], x);
47         } else {
48             cin >> k >> x;
49             add(k + 1, x);
50         }
51     }
52     for (int i = r[0]; i != 1; i = r[i]) {
53         cout << e[i] << " ";
54     }    
55     cout << endl;
56     return 0;
57 }

 

以上是关于2.双链表的主要内容,如果未能解决你的问题,请参考以下文章

基础数据结构---双链表go语言的代码实现

(王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)

双链表实现LRU缓存淘汰策略

数据结构 双链表的简单理解和基本操作

双链表删除一个节点

2.2 在单链表和双链表中删除倒数第K个节点