zoukankan      html  css  js  c++  java
  • 链表

    养成了开篇说废话的好习惯, 啊,写之前没想到要用指针来着,指针废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;
    }
    

    ❀ ❀

    ​ ❀

    而我们终其一生,都希望能成为更好的人。
  • 相关阅读:
    分表分库-------shading jdbc使用
    字符串之特殊符号处理
    【汇编程序】编程将100到200中的奇数求和,结果送到SUM字单元
    【汇编程序】从键盘输入一个大写字母,将其转换成小写字母
    【汇编程序】统计非数字的个数
    【读书笔记】看过的书籍列表整理
    【微机原理】数字电路器件—门 与门 或门 非门电路及实例
    【c语言】递归题
    【汇编程序】BUF为首址的100个字节单元用原码表示的有符号数依次编程用补码表示的有符号数
    【汇编程序】编写一个完整的程序 将这3个数的最大者存放到MAX单元
  • 原文地址:https://www.cnblogs.com/moziii/p/13288507.html
Copyright © 2011-2022 走看看