1.单链表

Posted fx1998

tags:

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

技术图片

 技术图片

 技术图片

 数组模拟单链表,图论的基础

单链表用的最多的是邻接表,邻接表是n个单链表,邻接表是树和图的存储方式

单链表 >> 邻接表 >> 存储树和图

技术图片

 单链表开始时是head指向空节点

插入元素后长这样

技术图片

 每个节点存储两个值

值:val

指针:next

 然后用数组模拟就需要定义几个数组

e[N]:存储每个节点的val值

ne[N]:存储每个点的next指针是多少

每个节点都有编号,空节点用-1表示

e[i]和ne[i]是用下标关联起来

0号点的值就是e[0],0号点的next指针就是ne[0] = 1

技术图片

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100010;
 4 //head表示头结点下标
 5 //e[i]表示节点i的值 
 6 //ne[i]表示节点i的next指针是多少,就是说节点i的下一个点的下标是什么
 7 //idx存储当前已经用到了哪个点
 8 //注意idx是从0开始的,0号点是第一个插入的点,第k个插入点的下标是k - 1
 9 //当我们需要分配一个新的点的时候,把当前idx指向的节点分配给它,然后idx++
10 int head, e[N], ne[N], idx;
11 //初始化 
12 void init() {
13     head = -1;
14     idx = 0; //当前可以从0号点开始分配
15 }
16 //将值为x的节点插入到头结点 
17 void add_to_head(int x) {
18     e[idx] = x;
19     ne[idx] = head;
20     head = idx;
21     idx++;
22 }
23 //将值为x的节点插入到下标为k的节点后面
24 //在下标是k - 1的点后面插入一个点
25 void add(int k, int x) {
26     e[idx] = x;
27     ne[idx] = ne[k];
28     ne[k] = idx;
29     idx++;
30 }
31 //将下标为k的节点的后面的一个节点删除
32 //第k个插入点的下标是k - 1
33 void remove(int k) {
34     ne[k] = ne[ne[k]];
35 } 
36 int main() {
37     init();
38     int m;
39     cin >> m;
40     while (m--) {
41         int k, x;
42         string c;
43         cin >> c;
44         if (c[0] == H) {
45             cin >> x;
46             add_to_head(x);
47         } else if (c[0] == D) {
48             cin >> k;
49             if (k == 0) {
50                 head = ne[head];
51             } else {
52                 remove(k - 1);
53             }
54         } else {
55             cin >> k >> x;
56             add(k - 1, x);
57         }
58     }
59     for (int i = head; i != -1; i = ne[i]) {
60         cout << e[i] << " ";
61     }
62     cout << endl;
63     return 0;
64 }

 

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

单链表反转java代码

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

单链表逆置

数据结构单链表&&静态链表详解和代码实例

java-----单链表