Acwing算法基础课--链表

一、单链表

AcWing 826. 单链表

代码

N = 100010
idx = 0
e = [0] * N
ne = [0] * N
head = -1def init():global idx,headidx = 0head = -1def add_head(x):global idx,heade[idx] = xne[idx] = headhead = idxidx += 1def delete(k):ne[k] = ne[ne[k]]def add_k(k,x):global idxe[idx] = xne[idx] = ne[k]ne[k] = idxidx += 1def _print():i = headwhile i != -1:print(e[i],end=" ")i = ne[i]if __name__ == "__main__":m = int(input())init()for _ in range(m):op = list(input().split())if op[0] == 'H':add_head(int(op[1]))elif op[0] == 'D':k = int(op[1])if k == 0:head = ne[head]delete(k-1)else:add_k(int(op[1])-1, int(op[2]))_print()

解析

1、head 的作用

  • head 是链表的入口指针。

  • 初始时 head = -1,表示链表为空。

  • 当链表有元素时,head 保存第一个节点的下标。

  • 遍历链表时,从 head 出发,通过 ne[idx] 不断找到下一个节点,直到遇到 -1 结束。


2、关于 k-1 的问题

  • 题意:将 x 插入到第 k 个插入的数后面。

  • 实现时,数组下标是从 0 开始的,所以第 k 个插入的数下标是 k-1

  • 因此调用时是 add(k-1, x)remove(k-1)

  • 如果初始化时 idx=1(而不是0),下标和 k 可以对齐,就不需要 k-1


3、e[idx]、ne[idx] 与 idx 的关系

  • 结点定义:链表的元素由 (e[idx], ne[idx]) 两部分组成。

  • e[idx]:编号为 idx 的节点存储的值。

  • ne[idx]:编号为 idx 的节点的下一个节点下标。

  • idx 本身只是一个编号(不一定连续),节点顺序要通过 ne 串联起来。


4、删除头节点 head = ne[head]

  • 删除的其实是链表的首元结点(第一个存值的结点)。

  • 操作原理:把 head 移动到原来 head 的下一个节点,即 ne[head]

  • 这样就跳过了原首元结点,等价于删除它。


5、为什么最后一个节点的 ne[idx] = -1

  • 初始时 head = -1,表示空链表。

  • 插入第一个元素时:e[0] = valne[0] = -1head = 0

  • 后续插入时,新节点的 ne[new] = head,再更新 head = new

  • 因为链表是靠 ne 串起来的,所以最后一个节点始终指向 -1,表示链表结束。

二、双向链表

AcWing 827. 双链表

代码

N = 100010
l = [0] * N
r = [0] * N
e = [0] * N
idx = 0def init():global idxr[0] = 1l[1] = 0idx = 2def delete(k):r[l[k]] = r[k]l[r[k]] = l[k]# 往k的右端插入  
def insert(k,x):global idxe[idx] = xr[idx] = r[k]l[idx] = kl[r[k]] = idxr[k] = idxidx += 1if __name__ == "__main__":m = int(input())init()for _ in range(m):op = list(input().split())if op[0] == "L":x = int(op[1])insert(0,x)elif op[0] == "R":x = int(op[1])insert(l[1],x)elif op[0] == "D":k = int(op[1])delete(k+1)elif op[0] == "IL":k = int(op[1])x = int(op[2])insert(l[k+1],x)else:k = int(op[1])x = int(op[2])insert(k+1,x)i = 0res = []while r[i] != 1:val = e[r[i]]res.append(val)i = r[i]print(" ".join(map(str,res)))

解析

  1. 数组设计

    • e[idx]:存放编号为 idx 的节点的值。

    • l[idx]:存放编号为 idx 的左指针(前驱节点下标)。

    • r[idx]:存放编号为 idx 的右指针(后继节点下标)。

  2. 哨兵节点(边界节点)

    • 下标 0 表示链表的 左端点(不存值)。

    • 下标 1 表示链表的 右端点(不存值)。

    • 初始化时:

      r[0] = 1 # 左端点指向右端点
      l[1] = 0 # 右端点指向左端点
      idx = 2 # 有效数据节点从下标 2 开始

  3. 传入函数时要用 k+1

    • 哨兵占用了下标 0 和 1

      • 下标 0:左端点(不存值)。

      • 下标 1:右端点(不存值)。

      • 所以真正存数据的节点是从 idx = 2 开始。

    • 题目里的第 k 个插入操作 vs 实际数组下标

      • 第 1 次插入得到的节点,逻辑上是“第 1 个元素”,但它的数组下标是 2

      • 一般情况:第 k 个插入的元素对应数组下标 k+1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96706.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI表征了西方的有界,AI+体现了东方的无界

AI表征了西方的有界,AI体现了东方的无界,试图通过文化差异的视角来对比传统AI(AI)与增强型或融合型AI(AI)的特征。一、“AI表征了西方的有界”西方的“有界”可以理解为:1、逻辑清晰、结构严谨&…

LabVIEW泵轮检测

​在现代制造业蓬勃发展的浪潮下,汽车行业也迎来了高速发展期。液力变矩器作为实现车辆自动变速的关键零件产品,在汽车动力系统中扮演着不可或缺的角色。泵轮作为液力变矩器的核心组成部分,其生产质量直接影响着液力变矩器的性能。因此&#…

RT-DETRv2 中的坐标回归机制深度解析:为什么用 `sigmoid(inv_sigmoid(ref) + delta)` 而不是除以图像尺寸?

引言:一个看似简单的公式,背后藏着工业级设计智慧 在阅读 RT-DETRv2(Real-Time DETR v2)源码时,我曾被一行代码深深震撼: inter_ref_bbox F.sigmoid(bbox_head[i](output) inverse_sigmoid(ref_points_de…

简单了解一下GraphRAG

传统RAG的缺点 当我们将一段文本信息以句子分割后,存入到向量数据库中。用户提问“老王喜欢吃什么”,这个问题会与向量数据库中的许多句子关联性比较强,能返回准确且具体的信息。 但是,若是问题换成“出现了几次西瓜”&#xff0c…

HTTP 状态码背后的逻辑:从请求到响应的完整流程解析(含完整流程图)

在日常的 Web 开发与 API 调试中,我们经常会遇到各种 HTTP 状态码 ——404 Not Found、401 Unauthorized、500 Internal Server Error... 这些数字背后并非随机出现,而是服务器处理请求过程中不同阶段的 "反馈信号"。理解这些状态码的触发逻辑…

Vue:下拉框多选影响行高

目录 一、 出现场景二、 解决方案 一、 出现场景 在使用el-select增加multiple属性进行多选时&#xff0c;会出现高度塌陷的情况 二、 解决方案 首先需要在el-select中增加collapse-tags属性&#xff0c;并在style中增加如下样式 方案一 <style scoped> ::v-deep .e…

如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?

1.简介研华已将高通跃龙QCS6490 技术应用于嵌入式模块、单板电脑和AI摄像头等各种规格的嵌入式硬件中。QCS6490平台支持全面的操作系统生态系统&#xff0c;包括Windows、Ubuntu、Yocto和 Android。Windows 11 IoT企业版是微软新一代的物联网操作系统&#xff0c;具有更强的安全…

阿里云国际代理:如何利用RDS构建高可用、可扩展的数据库架构

讲下云数据库RDS案例解析&#xff0c;若在上云或用云过程中有不懂的&#xff0c;可寻云枢国际yunshuguoji助力免卡上云用云。1、RDS MySQL数据库代理支持读写分离、连接保持、就近访问、事务拆分、连接池、SSL加密等功能&#xff0c;能够降低主实例负载&#xff0c;提高实例可用…

C++之特殊类设计

文章目录前言一、 设计一个不能被拷贝的类1. C98 实现方式2. C11 实现方式二、设计一个只能在堆上创建对象的类1. 方法一&#xff1a;析构函数私有&#xff0c;提供destory接口释放资源2. 方法二&#xff1a;构造函数私有三、 设计一个只能在栈上创建对象的类1. 实现方式四、设…

TupiTube,一款免费开源的 2D 动画创作工具

TupiTube&#xff0c;一款免费开源的 2D 动画创作工具 ** ** 功能 ** &#xff1a;开源、免费的 2D 动画软件&#xff0c;界面简单&#xff0c;支持逐帧动画、剪纸动画、定格动画&#xff0c;能导入素材并导出多种视频和图片格式&#xff0c;适合儿童、学生和动画爱好者入门创作…

MoE架构训练系统设计:专家并行与门控网络优化策略

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 混合专家&#xff08;Mixture of Experts&#xf…

使用Python爬虫,selenium和requests谁更强?

py爬虫的话&#xff0c;selenium和reqeusts谁更强&#xff0c;selenium是不是能完全取代requests? 答案基本是可以的&#xff0c;selenium适合动态网页抓取&#xff0c;因为它可以控制浏览器去点击、加载网页&#xff0c;requests则比较适合静态网页采集&#xff0c;它非常轻…

编译原理-文法压缩练习

这个任务的目标就是把一个给定的文法变得“干净”和“高效”&#xff0c;剔除所有无用的部分。根据幻灯片&#xff0c;无用的&#xff08;多余的&#xff09;规则分为两大类&#xff1a; 不可达规则&#xff1a;规则的“头”&#xff08;左部非终结符&#xff09;从起始符号出发…

GPU硬件架构和配置的理解

从公司架构理解GPU架构想象一个GPU就像一家大型科技公司&#xff0c;它的任务是处理图形和计算任务&#xff08;“干活”&#xff09;。硬件概念公司架构比喻作用和特点Platform (平台)集团公司最大的独立实体。比如谷歌Alphabet是一个集团公司&#xff0c;它旗下有谷歌、Waymo…

【硬件开发】电源抑制比PSRR

电源抑制比PSRR是电压输入量和电压输出量的比值&#xff0c;通常用dB来表示。 PSRR这个参数经常和运放&#xff0c;LDO,DCDC变换器有关联。(2 封私信 / 58 条消息) 电源抑制比(PSRR)的基础知识 - 知乎

七、卷积神经网络

目录 7.1 整体结构 7.2 卷积层 7.2.1 全连接层存在的问题 7.2.2 卷积运算 7.2.3 填充 7.2.5 3维数据的卷积运算 7.2.6 结合方块思考 7.2.7 批处理 7.3 池化层 7.4 卷积层和池化层的实现 7.4.1 4维数组 7.4.2 基于 im2col的展开 7.4.3 卷积层的实现 7.4.4 池化层的…

加餐加餐!烧烤斗破苍穹

忽然起了吃烧烤的念头&#xff0c;便掏出手机点了一堆。不过二十分钟&#xff0c;外卖小哥便按响了门铃&#xff0c;手里提着一个方正的纸袋&#xff0c;还冒着热气。我将烧烤一一取出&#xff0c;排在茶几上。肉串油光发亮&#xff0c;韭菜翠绿间点缀着蒜蓉&#xff0c;茄子剖…

搜索引擎收录网站带www和不带www有区别吗?

这是一个非常常见且重要的问题。简单直接的回答是&#xff1a;有区别&#xff0c;但对搜索引擎来说&#xff0c;处理得当就不会重复&#xff1b;处理不当则会造成严重重复和权重分散。下面我为您详细解释一下&#xff0c;并提供正确的处理方法。核心区别&#xff1a;两个不同的…

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件概述(ArkSIM集成开发环境 (IDE))

&#x1f514; AFSim2.9.0 相关技术、疑难杂症文章合集&#xff08;掌握后可自封大侠 ⓿_⓿&#xff09;&#xff08;记得收藏&#xff0c;持续更新中…&#xff09; 若还没有下载AFSim2.9.0完整软件或源码&#xff0c;请先进入本人另篇文章了解下载。 正文 ▪️主界面 打开 Ar…

建自己的Python项目仓库,使用工具:GitHub(远程仓库)、GitHub Desktop(版本控制工具)、VSCode(代码编辑器)

结合 GitHub&#xff08;远程仓库&#xff09;、GitHub Desktop&#xff08;版本控制工具&#xff09;、VSCode&#xff08;代码编辑器&#xff09; 三个工具&#xff0c;以下是更具体的Python项目仓库搭建流程&#xff0c;包含工具协同操作的详细步骤&#xff1a; 一、整体流程…