gwl999

博客园 首页 新随笔 联系 订阅 管理
  34 随笔 :: 0 文章 :: 0 评论 :: 2087 阅读

5.15

静态单链表


简单的方法:

成员变量:

int e[N],//存放节点的值
 ne[N],存放结点的next
 head,头结点指针
 idx;变化的指针
  • 初始化:

    • void init() {
          head = -1;//头结点最初指向-1
          idx = 0;//初始的位移指针是0;
      }  //初始化链表
  • 在头部位置添加:

    • void add_to_head(int x) {
          e[idx] = x, ne[idx] = head, head = idx++;
      }  //将x的值存在idx位置,将idx的下一个指向head结点,然后将idx,head指针变化位置,最后一步先赋值再加加;经典的头插法
  • 在任意位置插入

    • void add(int k, int x) {  //插入k后面的位置
          e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;
      }//原理与在头部位置插入一样
  • 删除某个位置的结点:

    • void remove(int k) {  //删除k结点的后一个结点
          ne[k] = ne[ne[k]];
      //头结点的下一位,变成头结点的下一位的下一位,就相当于删除了k位置的结点
      }

例题

链接:

https://www.acwing.com/problem/content/828/


 ps:自己画的图有点小丑,见谅

 

 

 

#include "iostream"
using namespace std;
const int N = 100010;
int head, e[N], ne[N], idx;
void init() {
    head = -1;
    idx = 0;
}  //初始化链表
void add_to_head(int x) {
    e[idx] = x, ne[idx] = head, head = idx++;
}  //将x的值存在idx位置,将idx的下一个指向head结点,然后将idx,head指针变化位置,经典的头插法
void add(int k, int x) {  //插入k后面的位置
    e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;
}
void remove(int k) {  //删除k结点的后一个结点
    ne[k] = ne[ne[k]];
}
int main() {
    int m;
    cin >> m;
    init();
    while (m--) {
        int k, x;
        char p;
        cin >> p;
        if (p == 'H') {
            cin >> x;
            add_to_head(x);
        } else if (p == 'D') {
            cin >> k;
            if (!k)
                head = ne[head];
            else
                remove(k - 1);
        } else {
            cin >> k >> x;
            add(k - 1, x);
        }
    }
    for (int i = head; i != -1; i = ne[i])
        //判断结束的位置其实是head=-1,也就是最开始的位置,i每次变化指针位置,指向下一个;
        cout << e[i] << " ";
    return 0;
}
posted on   呓雫  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示