当前位置:   article > 正文

数组模拟链表(单链表,双链表)

数组模拟链表

结构体+指针实现链表

  1. struct Node {
  2. int val;
  3. Node* next;
  4. };

每次创建一个新链表,就要调用new,new Node()这个操作非常慢,在笔试中一般不采用,会超时。

这里介绍用数组模拟链表,也称静态链表。

单链表:邻接表,用来存储图和树。

双链表:优化某些问题。

1.数组模拟单链表

e[N]数组来存储每个节点的值,用ne[N]数组来存储每个节点的next指针是多少。e数组和ne数组是由下标关联起来。空节点的下标用-1表示。

 初始化单链表

  1. //head 表示头节点的next指向,即ne[头节点]
  2. //e[i] 表示节点i的值
  3. //ne[i] 表示节点i的next指针是多少
  4. //idx 存储当前已经用到哪个点
  5. //初始化链表
  6. void init()
  7. {
  8. head = -1; //头节点指向空
  9. idx = 0;
  10. }

插入操作

  • 插到头节点的位置

将节点nx插入到head与n0节点中间。

插入操作后

  1. //将x插入到头节点
  2. void add_to_head(int x) //x为节点x存储的值
  3. {
  4. e[idx] = x; //设置x节点的值
  5. ne[idx] = head; //step1: x节点的next指向head的指向
  6. head = idx; //step2-3: head指向x节点
  7. idx ++; //当前可用节点后移
  8. }

初始化链表+在头节点处插入一个值为6的节点,代码详细过程

  •  插到任意位置
  1. //将x插入到节点k后面
  2. void add(int k, int x)
  3. {
  4. e[idx] = x;
  5. ne[idx] = ne[k];
  6. ne[k] = idx;
  7. idx ++;
  8. }

删除操作

删除n2节点,让n1的next指向n2的next指向(即n3)。

  1. //删除节点k的下一个节点
  2. void remove(int k)
  3. {
  4. ne[k] = ne[ne[k]];
  5. }

2. 数组模拟双链表

l[N]来表示某节点左边指向的一个节点,用r[N]来表示某节点右边指向的一个节点。

初始化双链表

  1. //初始化
  2. void init()
  3. {
  4. l[1] = 0; //节点1的左边是节点0
  5. r[0] = 1; //节点0的右边是节点1
  6. idx = 2;
  7. }

插入操作

在节点k的右边插入一个新节点。

step2和step3先后顺序不能变,如果先修改n1的右指针,那么待会儿n1的右指针就不再指向n2,要修改n2的左指针就不能通过step2的方法了。

  1. //在节点k的右边插入一个点
  2. void add(int k, int x)
  3. {
  4. e[idx] = x;
  5. l[idx] = k; //step1,该节点的左指针指向k
  6. r[idx] = r[k]; //step1,该节点的右指针指向k的右节点
  7. l[r[k]] = idx; //step2,节点k的右节点的左指针指向该节点
  8. r[k] = idx; //step3,节点k的右指针指向该节点
  9. idx ++;
  10. }

在节点k的左边插入一个数,即在节点k左节点的右边插入一个数,调用add(l[k],x)即可。

初始化链表+在节点0右边插入一个值为6的节点。

 删除操作

删除节点k。

  1. //删除节点k
  2. void remove(int k)
  3. {
  4. r[l[k]] = r[k];
  5. l[r[k]] = l[k];
  6. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/556390
推荐阅读
相关标签
  

闽ICP备14008679号