首页 > 其他分享 >链表

链表

时间:2024-09-16 08:55:58浏览次数:8  
标签:egtot head nxt int cnt 链表

链表可以 \(O(1)\) 插入/删除

单向链表

顾名思义 只有后继指针

邻接表

我习惯叫做链式前向星, 一般用来存储图, 挺好理解的, 这里直接给出存图的应用

struct edge {
    int to, nxt;
} eg[M];
int head[N], egtot;

void add (int u, int v) {
    eg[++egtot].to = v;
    eg[egtot].nxt = head[u];
    head[u] = egtot;
}

哈希表

通过链表实现一个整型到任意值的映射, 利用了取模意义下的剩余系, 代码:

struct hash_table {
    int head[P], nxt[N], key[N], val[N], cnt;

    int & operator [] (const int &x) {
        int tmp = x % P;
        for (int i = head[tmp]; i; i = nxt[i]) 
            if (key[i] == x) return val[i];
        nxt[++cnt] = head[tmp], head[tmp] = cnt;
        key[cnt] = x, val[cnt] = 0;
        return val[cnt];
    }
};

一般来讲模数选一个稍大的质数使得冲突概率降低,同时使数据分布更均匀

由于哈希表本身在数据较少的情况下运行很快,单次查找可以近似看做是 \(O(1)\) 的,那么可以用来代替 STL 的 map 实现更快的映射存储

发现只有全局操作, 所以可以维护 \(x \times mul + add\) 以及全局和 \(sum\)

然后全局赋值就是清空, 使用哈希表维护一个下标到值的映射, 单点修改就可以使用映射完成

双向链表

顾名思义, 记录前驱和后继

考虑一个问题, 有一个数组, 如何按顺序从左到右删除这个数, 并实时维护它的排序数组?

使用 \(set\) 或者 平衡树?

实际上没有修改, 只有删除, 可以使用双向链表, 首先排序一下, 然后我们删除就可以做成 \(O(1)\) 的了

总复杂度就是 \(O(n)\) 的了

初始化就是上述的问题了, 剩下的内容是一个倍增, 因为决策点始终唯一所以可以倍增

循环链表

把双向链表头尾套接到一起, 一般用于处理有环的问题

十字链表

需要维护上下左右四个指针, 常见应用是 \(DLX\)

标签:egtot,head,nxt,int,cnt,链表
From: https://www.cnblogs.com/aqz180321/p/18415590

相关文章

  • 旋转链表
    旋转链表开头:对于链表的建立已经熟悉,那我们现在讲讲旋转链表的如何实现,当然旋转链表的建立是在已经掌握普通链表的基础上讲解。正文:旋转链表,顾名思义就是让链表“动起来”。即:使链表尾部最后的结点转到链表首部的位置。假设已经建立好一条6个结点的链表,它的初始状态如下图:我......
  • C语言:链表
    链表是一种常见的基础数据结构,它由一系列节点(Node)组成。每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)。链表的特点是元素在内存中不一定连续存储,而是通过指针连接起来。以下是链表的一些基本特点:动态性:链表的长度可以动态变化,不需要在创建时指定大小。灵活......
  • Day4||24.两两交换链表中的节点|19.删除链表的倒数第n个结点|面试题:链表相交|142.环形
    24.两两交换链表中的节点题目:24.两两交换链表中的节点-力扣(LeetCode)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。图解思路首先,虚拟头结点挺方便链表进行增删改操作的。本题操作用到三......
  • 链表的快速排序(C/C++实现)
    一、前言大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍......
  • 【JavaScript】LeetCode:707设计链表
    文章目录题目内容题目分析(1)获取第n个节点的值(2)头部插入节点(3)尾部插入节点(4)第n个节点前插入节点(5)删除第n个节点完整代码题目内容题目分析添加哨兵节点dummy。在第n个节点前插入节点时,应该找到第n-1个节点(即前一个节点),才能完成插入操作。在删除第n......
  • 4、循环单链表
    1、代码实现#include<stdio.h>#include<malloc.h>#include<assert.h>typedefintElemType;typedefstructNode{ElemTypedata;structNode*next;}Node,*PNode;typedefstructSCList{PNodefirst;PNodelast;intsize;}S......
  • 19_删除链表的倒数第N个结点
    19_删除链表的倒数第N个结点【问题描述】给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例一:输入:head=[1],n=1输出:[]示例二:输入:head=[1,2],n=1输出:[1]提示:链表中结点的数目为sz1<=sz<=300<=Node.val<=1001<=n<=sz【算......
  • 3、静态链表
    1、静态链表初始化head指向-1代表当前为空链表,pool指向下一个可用空间(在数组下标为2的空间),2指向3,3指向4,最后的指向0表示没有下一个节点,以此链接起来。2、实现代码#include<stdio.h>#include<malloc.h>#defineMAX_SIZE20typedefcharElemType;typedefstructS......
  • 链表
    1、创建链表-无头结点#include<stdio.h>#include<malloc.h>#include<assert.h>typedefintElemType;//定义链表typedefstructListNode{ElemTypedata;structListNode*next;}ListNode;typedefListNode*PList;//初始化链表,让链表一开始指向为空v......
  • 华为OD机试真题-寻找链表的中间节点-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客   题目描述给定一个单链表QL,请编写程序输出L中间结点保存的数据,如果有两个中间结点,则输出第二个中间结点保存的数据。例如:给定L为1→7→5,则输出应该为7,给定L为1→2→3→4,则输......