707, 设计链表, LinkedList, 单链表, Dummy Head, C++

目录

  • 题意速览
  • 解题思路与设计要点
  • C++ 代码实现(单链表 + 虚拟头结点)
  • 时间复杂度与空间复杂度
  • 常见坑位与边界用例
  • 对比:双链表如何优化
  • 单元测试样例(可直接粘贴运行)
  • 总结

题意速览

设计一个支持如下操作的链表:

  • get(index):返回索引 index 处的值,不合法返回 -1
  • addAtHead(val):头插;
  • addAtTail(val):尾插;
  • addAtIndex(index, val):在 index 位置前插入;如果 index==size 等价尾插;如果 index>size 不插;如果 index<0 按头插处理;
  • deleteAtIndex(index):删除 index 处节点,非法索引则忽略。

解题思路与设计要点

  • 使用「虚拟头结点 DummyHead」简化边界:头插、删头都不用特判。
  • 维护 size 保证 O(1) 判合法与尾插定位边界;
  • 单链表前驱节点访问需要遍历,统一封装「定位到 index 的前一节点」的辅助函数;
  • addAtIndexindex<0 视为 0(题目要求),对 index>size 直接 return;
  • deleteAtIndex 需校验范围 [0, size-1]

C++ 代码实现(单链表 + 虚拟头结点)

#include <bits/stdc++.h>
using namespace std;class MyLinkedList {
public:struct Node {int val; Node* next;Node(int v=0): val(v), next(nullptr) {}};MyLinkedList() {_dummy = new Node(); // 虚拟头_size = 0;}int get(int index) {if (index < 0 || index >= _size) return -1;Node* cur = _dummy->next;while (index--) cur = cur->next;return cur->val;}void addAtHead(int val) {addAtIndex(0, val);}void addAtTail(int val) {addAtIndex(_size, val);}void addAtIndex(int index, int val) {if (index > _size) return;          // 超界不插if (index < 0) index = 0;           // 负数按 0 处理Node* prev = _dummy;for (int i = 0; i < index; ++i) prev = prev->next;Node* node = new Node(val);node->next = prev->next;prev->next = node;++_size;}void deleteAtIndex(int index) {if (index < 0 || index >= _size) return;Node* prev = _dummy;for (int i = 0; i < index; ++i) prev = prev->next;Node* del = prev->next;prev->next = del->next;delete del;--_size;}~MyLinkedList() {Node* cur = _dummy;while (cur) { Node* nxt = cur->next; delete cur; cur = nxt; }}private:Node* _dummy;int _size;
};

时间复杂度与空间复杂度

  • get / addAtIndex / deleteAtIndex 定位需要 O(n);
  • addAtHead / addAtTail 退化到 O(n)(单链表无尾指针情况下),如需 O(1) 尾插可维护尾指针;
  • 额外空间 O(1)(不计存储本身)。

常见坑位与边界用例

  • index == size 允许插入(等价尾插);index > size 直接忽略。
  • index < 0 视为头插;
  • 先移动到前驱位置再插/删,避免对 index==0 的特判;
  • 删除后别忘 --size,插入后 ++size
  • 析构释放所有节点(在线评测不强制,但工程上必须)。

推荐用例(覆盖边界):

addAtHead(1)            -> [1]
addAtTail(3)            -> [1,3]
addAtIndex(1,2)         -> [1,2,3]
get(1) == 2
deleteAtIndex(1)        -> [1,3]
get(1) == 3
addAtIndex(5,10)        -> ignore
addAtIndex(-2,7)        -> [7,1,3]

对比:双链表如何优化

  • 额外存 prev 指针,可 O(1) 从任意节点删除;
  • 若同时维护尾指针与 size,addAtTail 可达 O(1)
  • 但节点更重,内存与指针安全性要求更高(注意野指针/悬垂指针)。

单元测试样例(可直接粘贴运行)

#include <bits/stdc++.h>
using namespace std;// 将上面的 MyLinkedList 粘贴到此处int main() {MyLinkedList list;list.addAtHead(1);list.addAtTail(3);list.addAtIndex(1, 2);   // [1,2,3]cout << list.get(1) << "\n"; // 2list.deleteAtIndex(1);   // [1,3]cout << list.get(1) << "\n"; // 3list.addAtIndex(5, 10);  // ignorelist.addAtIndex(-2, 7);  // [7,1,3]cout << list.get(0) << "," << list.get(1) << "," << list.get(2) << "\n"; // 7,1,3return 0;
}

总结

  • 这题的本质是「抽象一个受控的链表 API」,工程感强:
    • 统一用 Dummy Head 吸收边界。
    • 明确 index 规则并维护 size
    • 写完先过“增删改查 + 异常输入”的自测清单。
  • 若要进一步提速,可切到双链表并维护尾指针;如对内存敏感或题目简单,单链表足够。

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

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

相关文章

NAS自建笔记服务leanote2

leanote2(GitHub - wiselike/leanote2: leanote2, 适用于NAS自建的笔记服务) 是一个开源的在线笔记应用程序&#xff0c;继承自原 leanote 项目。向原 leanote 的开发者表示深深的感谢与尊重&#xff0c;正是他们的辛勤付出奠定了这个优秀的笔记平台的基础。 但由于 leanote 项…

模型剪枝----ResNet18剪枝实战

剪枝 模型剪枝&#xff08;Model Pruning&#xff09; 是一种 模型压缩&#xff08;Model Compression&#xff09; 技术&#xff0c;主要思想是&#xff1a; 深度神经网络里有很多 冗余参数&#xff08;对预测结果贡献很小&#xff09;。 通过去掉这些冗余连接/通道/卷积核&am…

K8S-Pod(上)

Pod概念 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod是一组&#xff08;一个或多个&#xff09;容器&#xff1b;这些容器共享存储、网络、以及怎样运行这些容器的规约。Pod 中的内容总是并置&#xff08;colocated&#xff09;的并且一同调度&am…

Flink TaskManager日志时间与实际时间有偏差

Flink 启动一个任务后&#xff0c;发现TaskManager上日志时间与实际时间相差约 15 小时。 核心原因可能是&#xff1a; 1、 服务器&#xff08;或容器&#xff09;的系统时间配置错误2、 Flink 日志组件&#xff08;如 Logback/Log4j&#xff09;的时间配置未使用系统默认时区…

Webug3.0通关笔记18 中级进阶第06关 实战练习:DisCuz论坛SQL注入漏洞

目录 一、环境搭建 1、服务启动 2、源码解压 3、构造访问靶场URL 4、靶场安装 5、访问论坛首页 二、代码分析 1、源码分析 2、SQL注入分析 三、渗透实战 &#xff08;1&#xff09;判断是否有SQL注入风险 &#xff08;2&#xff09;查询账号密码 Discuz! 作为国内知…

SWEET:大语言模型的选择性水印

摘要背景与问题大语言模型出色的生成能力引发了伦理与法律层面的担忧&#xff0c;于是通过嵌入水印来检测机器生成文本的方法逐渐发展起来。但现有工作在代码生成任务中无法良好发挥作用&#xff0c;原因在于代码生成任务本身的特性&#xff08;代码有其特定的语法、逻辑结构&a…

FastDFS V6双IP特性及配置

FastDFS V6.0开始支持双IP&#xff0c;tracker server和storage server均支持双IP。V6.0新增特性说明如下&#xff1a;支持双IP&#xff0c;一个内网IP&#xff0c;一个外网IP&#xff0c;可以支持NAT方式的内网和外网两个IP&#xff0c;解决跨机房或混合云部署问题。FastDFS双…

笔记本、平板如何成为电脑拓展屏?向日葵16成为副屏功能一键实现

向日葵16重磅上线&#xff0c;本次更新新增了诸多实用功能&#xff0c;提升远控效率&#xff0c;实现应用融合突破设备边界&#xff0c;同时全面提升远控性能&#xff0c;操作更顺滑、画质更清晰&#xff01;无论远程办公、设计、IT运维、开发还是游戏娱乐&#xff0c;向日葵16…

基于Spring Boot + MyBatis的用户管理系统配置

我来为您详细分析这两个配置文件的功能和含义。 一、文件整体概述 这是一个基于Spring Boot MyBatis的用户管理系统配置&#xff1a; UserMapper.xml&#xff1a;MyBatis的SQL映射文件&#xff0c;定义了用户表的增删改查操作application.yml&#xff1a;Spring Boot的核心配置…

80(HTTP默认端口)和8080端口(备用HTTP端口)区别

文章目录**1. 用途**- **80端口**- **8080端口****2. 默认配置**- **80端口**- **8080端口****3. 联系**- **逻辑端口**&#xff1a;两者都是TCP/IP协议中的逻辑端口&#xff0c;用于标识不同的网络服务。- **可配置性**&#xff1a;端口号可以根据需要修改&#xff08;例如将T…

【开题答辩全过程】以 汽车知名品牌信息管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

从全栈工程师视角解析Java与前端技术在电商场景中的应用

从全栈工程师视角解析Java与前端技术在电商场景中的应用 面试背景介绍 面试官&#xff1a;你好&#xff0c;很高兴见到你。我叫李明&#xff0c;是这家电商平台的资深架构师。今天我们会聊聊你的技术能力和项目经验。你可以先简单介绍一下自己吗&#xff1f; 应聘者&#xff1a…

【python】python进阶——多线程

引言在现代软件开发中&#xff0c;程序的执行效率至关重要。无论是处理大量数据、响应用户交互&#xff0c;还是与外部系统通信&#xff0c;常常需要让程序同时执行多个任务。Python作为一门功能强大且易于学习的编程语言&#xff0c;提供了多种并发编程方式&#xff0c;其中多…

【JavaEE】(23) 综合练习--博客系统

一、功能描述 用户登录后&#xff0c;可查看所有人的博客。点击 “查看全文” 可查看该博客完整内容。如果该博客作者是登录用户&#xff0c;可以编辑或删除博客。发表博客的页面同编辑页面。 本练习的博客网站&#xff0c;并没有添加注册功能&#xff0c;以及上传作者头像功能…

MySQL全库检索关键词 - idea 工具 Full-Text Search分享

我们经常要在库中查找一个数据&#xff0c;又不知道在哪个表、哪个字段&#xff1b;或者想找到哪里有在用这个数据。我们可以用&#xff1a;idea 的 Database工具 - Full-Text Search打开idea&#xff0c;在工具栏找到 Database 然后新建自己的连接&#xff0c;然后右键&#x…

银行卡号识别案例

代码实现&#xff1a;import cv2 import numpy as np import argparse import myutils-i moban.png -t card1.pngap argparse.ArgumentParser() ap.add_argument("-i","--image", requiredTrue,help"path to input image") ap.add_argument(&quo…

云管平台上线只是开始:从“建好”到“用好”的运营、推广与深化指南

项目上线的喜悦转瞬即逝,随之而来的是一个更为现实和复杂的阶段:运营。云管平台(CMP)的成功,不再仅仅取决于其技术架构的先进性,更在于它能否融入组织的肌理,为不同角色持续创造价值。本文将从管理者、平台团队、开发者、运维和财务五个核心角色的视角,深入探讨平台上线…

distributed.client.Client 用户可调用函数分析

distributed.client.Client 用户可调用函数分析 1. 核心计算函数 任务提交和执行submit(func, *args, keyNone, workersNone, resourcesNone, retriesNone, priority0, fifo_timeout60s, allow_other_workersFalse, actorFalse, actorsFalse, pureNone, **kwargs) 提交单个函数…

数字图像处理——信用卡识别

在数字支付时代&#xff0c;信用卡处理自动化技术日益重要。本文介绍如何利用Python和OpenCV实现信用卡数字的自动识别&#xff0c;结合图像处理与模式识别技术&#xff0c;具有显著实用价值。系统概述与工作原理信用卡数字识别系统包含两大核心模块&#xff1a;模板数字预处理…

嵌入式ARM64 基于RK3588原生SDK添加用户配置选项./build lunch debian

1 背景 在我们正常拿到SDK后会有一些配置选项&#xff0c;在使用./build.sh lunch之后会输出一些defautconfig让我们选择&#xff0c;瑞芯微的原厂sdk会提供一些主板的配置选项&#xff0c;但是我们的如果是一块新的主板就需要添加自己的配置选项&#xff0c;本文就讨论如何来添…