• 链表


    养成了开篇说废话的好习惯, 啊,写之前没想到要用指针来着,指针废qwq

    链表

    +++

    认识一下

    链表 & 数组都可用于存储数据,链表通过 指针 来连接元素, 而数组是把所有元素按次序存储

    各自优势:

    链表 : 方便地删除、插入数据 —— (O(1)) ,但随机访问数据 —— (O(n))

    数组 : 随机访问数据 —— (O(1)) , 删除、插入数据 —— (O(n))


    构建

    单向链表

    • 数据域 : 存放数据
    • 指针域 : 连接当前节点和下一节点
    struct Node {
        int value;
        Node *nxet;
    }
    

    双向链表

    不同于单向 : 指针域 : 连接当前节点和下一节点

    struct Node {
        int value;
        Node *left, *right;
    }
    

    向链表中插入(写入)数据

    单向链表

    void insert(int i, Node *p) {
        Node *node = new Node;
        node->value = i;
        node->nxet = p->nxet;
        p->nxet = node;
    }
    

    img

    单向循环链表

    将链表的头和尾连接起来

    void insert(int i, Node) {
        Node *node = new node;
        node->value = i;
        node->nxet = NULL;
        if(p == NULL) { //判断原链表是否为空,空则自身循环
            p = node;
            node->nxet = node;
        } else { //不空则正常插入
            node->nxet = p->nxet;
            p->nxet = node;
        }
    }
    

    img

    双向循环链表

    void insert(int i, Node *p) {
        Node *node = new Node;
        node->value = i;
        if(p == NULL) {
            p = node;
            node->left = node;
            node->right = node;
        } else {
            node ->left = p;
            node->right = p->right;
            p->right->left = node;
            p->right = node;
        }
    }
    

    从链表中删除数据

    单向(循环)链表

    p->nxet 的值覆盖给 p ,同时更新 p 的下下个节点

    void deletenode(Node *p) {
        p->value = p->nxet->value;
        Node *t = p->nxet;
        p->nxet = p->nxet->nxet;
        delete t;
    }
    

    img

    双向循环链表

    画个图自行理解一下就好啦( ̄▽ ̄)/

    void deletenode(Node *p) {
        p->left->right = p->right;
        p->right->left = p->left;
        Node *t = p;
        p = p->right;
        delete t;
    }
    

    撒花✿✿ヽ(°▽°)ノ✿

    还是数组香 ↓ 我直接搬书

    struct Node{
        int value;
        int pre, next;
    } node[SIZE];
    int head, tail, tot;
    
    int init(){
        tot = 2;
        head = 1; tail = 2;
        node[head].next = tail;
        node[tail].pre = head;
    }
    
    void insert(int p, int val){
        q = ++ tot;
        node[q].value = val;
        node[node[p].next].pre = q;
        node[q].next = node[p].next;
        node[p].next = q;
        node[q].pre = p;
    }
    
    void remove(int p){
        node[node[p].pre].next = node[p].next;
        node[node[p].next].pre = node[p].pre;
    }
    
    void clear(){
        memset(node, 0, sizeof(node));
        head = tail = tot = 0;
    }
    

    ❀ ❀

    ​ ❀

    而我们终其一生,都希望能成为更好的人。
  • 相关阅读:
    随笔为什么还要想标题
    [GXYCTF2019]BabySQli
    [CISCN2019 华北赛区 Day2 Web1]Hack World
    20年美亚杯个人赛-ALICE_USB部分WRITE UP
    20年美亚杯个人赛-Alice LG Phone部分WRITE UP
    20年美亚杯个人赛-Alice_Laptop部分WRITE UP
    20年美亚杯WRITE UP
    18年美亚杯团体赛-C部分 WRITE UP
    v&n赛 ML 第一步(python解决)
    CTFHub web技能树 RCE
  • 原文地址:https://www.cnblogs.com/moziii/p/13288507.html
Copyright © 2020-2023  润新知