数组实现链表(C++代码+图解)

数组实现链表(C++代码+图解)

单链表

应用:实现邻接表(链式前向星),进而实现树和图的表示

定义变量和数组

int head, e[N], ne[N], idx;

注意:下面的i不是指第i个节点,而是下标为i的节点,即“指针”i指向的节点

head 表示第一个节点的下标 == first指针

e[i] 表示节点i的值 == 节点i的data

ne[i] 表示节点i的下一个节点的下标 == 节点i的next指针

idx 表示下一个新建节点的下标

eg: 单链表:3 5 7 9

在这里插入图片描述

初始化

void init() {
    head = -1;
    idx = 0;
}

在这里插入图片描述

插入

1.插入到第一个节点前

void intsert_to_head(int x) {
    e[idx] = x;
    ne[idx] = head;  // 1.
    head = idx;  // 2.
    idx++;
}

在这里插入图片描述

2.插入到k节点后

注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点

void insert_to_k(int k, int x) {
    e[idx] = x;
    ne[idx] = ne[k];  // 1.
    ne[k] = idx;  // 2.
    idx++;
}

在这里插入图片描述

删除

删除k节点后的一个节点

注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点

直接更新k节点的next指针为第k+1个节点的next指针;

void remove(int k) {
    ne[k] = ne[ne[k]];
}

在这里插入图片描述

双链表

eg: 双链表:3 5 7 9

在这里插入图片描述

定义变量和数组

int e[N], l[N], r[N], idx;

注意:下面的i不是指第i个节点,而是下标为i的节点,即“指针”i指向的节点

e[i] : 节点i的值 == 节点i的data

l[i]: 节点i的前一个节点的下标 == 节点i的左指针

r[i]: 节点i的下一个节点的下标 == 节点i的右指针

idx: 下一个新建节点的下标

初始化

采用技巧:设置节点0为起始节点,节点1为尾节点,下标从2开始,不设head指针

void init() {
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

在这里插入图片描述

插入

在节点k右边插入值为x的节点

注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点

void insert(int k, int x) {
    e[idx] = x;
    r[idx] = r[k];  // 1.
    l[idx] = k;  // 2.
    l[r[k]] = idx;  // 3.
    r[k] = idx;  // 4,
    idx++;
}

在这里插入图片描述

特殊点插入时:

  1. 插入到第一个节点前

    // 相当于插入到头节点后
    // 头节点下标为0
    insert(0, x);
    
  2. 插入到最后一个节点后

    // 相当于插入到尾节点的左节点右边
    // 尾节点下标为1,所以尾节点的左节点下标为l[1]
    insert(l[1], x);
    
  3. 插入到k节点左边

    // 相当于插入到k节点的左节点的右边
    // k节点的左节点下标为l[k]
    insert(l[k], x);
    

删除

删除节点k

注意:这里的k不是指第k个节点,而是下标为k的节点,即“指针”k指向的节点

void remove(int k) {
    r[l[k]] = r[k];  // 1.
    l[r[k]] = l[k];  // 2.
}

在这里插入图片描述

  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值