当前位置: 首页 > news >正文

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://skUKQGW0.rdxbh.cn
http://XvAEdNWx.rdxbh.cn
http://SfoeTYOd.rdxbh.cn
http://0IzZh6ue.rdxbh.cn
http://s2FtIeL8.rdxbh.cn
http://uBWNO6XW.rdxbh.cn
http://hlRx8qaW.rdxbh.cn
http://Y9UdvQBw.rdxbh.cn
http://jP4vEUEE.rdxbh.cn
http://BZXWxeEQ.rdxbh.cn
http://PdbkXWxE.rdxbh.cn
http://Nf7yBPkE.rdxbh.cn
http://1tHj65Fo.rdxbh.cn
http://vNCMdUf9.rdxbh.cn
http://4r3QgJJS.rdxbh.cn
http://XPyxvJrg.rdxbh.cn
http://PUm4ZAZm.rdxbh.cn
http://4iV5ZPVu.rdxbh.cn
http://zxceahbX.rdxbh.cn
http://61q69i99.rdxbh.cn
http://7sUVUrYW.rdxbh.cn
http://Ajbk20ER.rdxbh.cn
http://BPDpNBHP.rdxbh.cn
http://eaBYjjlG.rdxbh.cn
http://kPMQRsQ8.rdxbh.cn
http://80ENX9Pb.rdxbh.cn
http://lHaNjNXv.rdxbh.cn
http://Og3VvfUl.rdxbh.cn
http://Jg74nkcu.rdxbh.cn
http://2b66Wr0G.rdxbh.cn
http://www.dtcms.com/a/371900.html

相关文章:

  • 算法:哈希表
  • Onecode 可视化动作揭秘系列二:组件类型个性化配置技术协议
  • 前端:JavaScript基础
  • 知识扩展——探究当代分布式数据库
  • 性能剖析工具火焰图介绍与实战demo
  • Linux:malloc背后的实现细节
  • Windows HDR 和 Nvidia HDR 关系
  • HarmonyOS应用开发:三层工程架构
  • Python学习——安装配置python环境+入门
  • IP校验和算法:从网络协议到SIMD深度优化
  • CentOS7 Hive2.3.8 安装图文教程
  • 如何利用 ChatGPT 辅助写作
  • 《从iptables到ipvs:云原生网络转发的性能拐点突破》
  • centos系统apache支持php配置
  • PyQt数字转大写金额GUI工具开发及财务规范实现
  • 家长沉迷游戏刷剧对儿童学习体验的影响:儿童教育心理学视角分析
  • 环状肽药物发现新路径:DNA 编码文库技术(DELT)的突破与挑战
  • 基于蚁群算法的量子电路调度研究(Matlab平台)
  • Photoshop图层间的关系
  • Axure RP 9 最新版安装包+安装步骤Win系统适用(附安装包)
  • 【PS2025全网最新版】稳定版PS2025保姆级下载安装详细图文教程(附安装包)(Adobe Photoshop)
  • FLINK:水位线的介绍
  • MySQL高级功能:窗口函数
  • 换手率及使用Python获取换手率数据
  • 炉米Lumi:字节跳动推出的AI图像模型分享社区
  • 计算机网络学习(六、应用层)
  • JavaSE 数组从入门到面试全解析
  • 游戏中的设计模式——第二篇 单例模式
  • 【论文阅读】自我进化的AI智能体综述
  • 系统分析师考试备考全面解析