【Leetcode】 707. 设计链表

news2025/1/17 0:55:40

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性valnextval当前节点的值next 是指向下一个节点的指针/引用

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList

MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例

输入
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"] [[], [1], [3], [1, 2], [1], [1], [1]]

输出
[null, null, null, null, 2, null, 3]

解释
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2); // 链表变为 1->2->3
myLinkedList.get(1); // 返回 2
myLinkedList.deleteAtIndex(1); // 现在,链表变为 1->3
myLinkedList.get(1); // 返回 3

提示

0 <= index, val <= 1000
请不要使用内置的 LinkedList 库。
调用 getaddAtHeadaddAtTailaddAtIndexdeleteAtIndex 的次数不超过 2000


AC:

/*
 * @lc app=leetcode.cn id=707 lang=cpp
 *
 * [707] 设计链表
 */

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */
// @lc code=start
class MyLinkedList {
public:
    struct LinkNode {
        int val;
        LinkNode* next;
        LinkNode(int val):val(val), next(nullptr){}
    };

    MyLinkedList() {
        _dummyHead = new LinkNode(0);
        _size = 0;
    }
    
    int get(int index) {
        if(index > (_size - 1) || (index < 0)) {
            return -1;
        }
        LinkNode* cur = _dummyHead->next;
        while(index--) {
            cur = cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        LinkNode* newNode = new LinkNode(val);
        newNode->next = _dummyHead->next;
        _dummyHead->next = newNode;
        _size++;
    }
    
    void addAtTail(int val) {
        LinkNode* newNode = new LinkNode(val);
        LinkNode* cur = _dummyHead;
        while(cur->next) {
            cur = cur->next;
        }
        cur->next = newNode;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if(index > _size)
            return ;
        if(index < 0)
            index = 0;
        LinkNode* newNode = new LinkNode(val);
        LinkNode* cur = _dummyHead;
        while(index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        if(index >= _size || index < 0)
            return ;
        LinkNode* cur = _dummyHead;
        while(index--) {
            cur = cur->next;
        }
        LinkNode* tmp = cur->next;
        cur->next = cur->next->next;
        tmp = nullptr;
        delete(tmp);
        _size--;
    }
private:
    int _size;
    LinkNode* _dummyHead;
};
// @lc code=end

AC

需要注意的是,链表初始化时出现的c++11 构造函数与成员初始化器列表语法
C++11引入了新的成员初始化器列表语法,可以更方便地初始化成员变量。使用该语法的构造函数的函数体之前,必须有一个成员初始化器列表,用冒号(:)分隔。初始化器列表的语法如下:

class MyClass {
public:
    // 无参构造函数
    MyClass() : member1(initialValue1), member2(initialValue2), ... {
        // 构造函数体
    }

    // 有参构造函数
    MyClass(int arg1, double arg2, ...) : member1(arg1), member2(arg2), ... {
        // 构造函数体
    }

private:
    // 成员变量
    int member1;
    double member2;
    ...
};

其中,initialValue1initialValue2等为成员变量的初始值,arg1arg2等为构造函数的参数。在成员初始化器列表中,每一个成员变量的初始化语句使用逗号分隔,每个语句由成员变量名称和初始化表达式组成(也可以使用成员函数返回值进行初始化)。对于没有在初始化器列表中出现的成员变量,它们会使用它们的默认构造函数进行初始化。

使用成员初始化器列表可以减少代码行数内存分配次数,提高程序的效率和可读性。


假设有一个类 Person,包含了名字(name)、年龄(age)、职业(job)等成员变量,我们可以使用成员初始化器列表来初始化这些成员变量:

class Person {
public:
    // 有参构造函数
    Person(string _name, int _age, string _job) 
        : name(_name), age(_age), job(_job)
    {
        // 构造函数体
    }

private:
    string name;
    int age;
    string job;
};

在上面的代码中,我们使用了成员初始化器列表来初始化 nameagejob 这三个成员变量,代码更加简洁高效。

如果不使用成员初始化器列表,代码如下:

class Person {
public:
    // 有参构造函数
    Person(string _name, int _age, string _job) {
        name = _name;
        age = _age;
        job = _job;
        // 构造函数体
    }

private:
    string name;
    int age;
    string job;
};

这样的代码虽然跟使用成员初始化器列表的代码基本相同,但是在代码实际执行的时候,由于需要对成员变量进行多次赋值,所以效率会低一些。因此,在实际开发中推荐使用成员初始化器列表

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

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

相关文章

英语——分享篇——每日200词——1201-1400

1201——wound——[wu:nd]——n.伤口&#xff0c;创伤——wound——wo我(拼音)un联合国(编码)d狗(编码dog)——我在联合国治好了狗的伤口——The nurse cleaned the wound .——护士清洗了伤口。 1202——from——[frɒm]——prep.来自&#xff0c;从&#xff0c;由于——from—…

正点原子嵌入式linux驱动开发——pinctrl和gpio子系统

在上一篇笔记中&#xff0c;学习编写了基于设备树的LED驱动&#xff0c;但是驱动的本质还是没变&#xff0c;都是配置LED灯 所使用的GPIO寄存器&#xff0c;驱动开发方式和裸机基本没区别。Linux是一个庞大而完善的系统&#xff0c;尤其是驱动框架&#xff0c;像GPIO这种最基本…

C++11 正则表达式详解

目录 1 正则表达式语法1.1 字符和特殊字符1.2 限定符1.3 定位符1.4 选择和反向引用 2 C正则表达式标准库常用接口3 C正则表达式模板的使用3.1 匹配&#xff08;Match&#xff09;3.2 搜索&#xff08;Search&#xff09;3.3 分词&#xff08;Tokenize&#xff09;3.4 替换&…

【前端学习】—ES6新增的方法有哪些(十五)

【前端学习】—ES6新增的方法有哪些&#xff08;十五&#xff09; 一 、ES6中新增的方法 &#xff08;一&#xff09;、Object.is() //用于判断两个值/数据类型是否相等/* 特点&#xff1a;不仅可以对值类型进行正常处理&#xff0c;对象类型的值也可以处理对于特殊的值NaN 也…

分享一下怎么做多门店小程序

近年来&#xff0c;随着互联网的普及和移动支付的兴起&#xff0c;越来越多的商家开始涉足线上业务&#xff0c;开发自己的小程序。对于拥有多家门店的连锁品牌来说&#xff0c;开发多门店小程序是一个非常不错的选择。本文将围绕多门店小程序的制作展开讨论&#xff0c;希望能…

阿里8年经验之谈 —— 如何选择合适的自动化测试工具?

自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中&#xff0c;几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试&#xff0c;以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务&a…

【网络安全 --- XSS绕过】xss绕过手法及思路你了解吗?常见及常用的绕过手法了解一下吧

本次博客以pikachu靶场为例&#xff0c;需要安装靶场可以参考以下博客&#xff08;都包含工具&#xff0c;镜像下载地址&#xff09; 一&#xff0c;工具资源下载 1-1 VMware虚拟机的安装 请参考以下博客&#xff0c;包含资源下载地址&#xff08;若已安装请忽略&#xff09;…

2023年知名国产数据库厂家汇总

随着信创国产化的崛起&#xff0c;大家纷纷在寻找可替代的国产数据库厂家。这里小编就给大家汇总了一些国内知名数据库厂家&#xff0c;仅供参考哦&#xff01; 2023年知名国产数据库厂家汇总 1、人大金仓 2、瀚高 3、高斯 4、阿里云 5、华为云 6、浪潮 7、达梦 8、南大…

基于java网上书城系统的设计与实现

1 绪 论 网上书城系统采用了一种ssm的开发框架。讨论该系统的需求分析&#xff0c;将系统分为两大模块。前台模块由五部分功能组成&#xff0c;而后台模块则由八部分功能组成。作为网上书城系统&#xff0c;它的设计目的是改变传统的图书销售模式&#xff0c;迎合当代主流需…

acwing算法基础之数据结构--KMP算法

目录 1 知识点2 模板 1 知识点 KMP算法已经集成到string类型的find()方法了&#xff0c; 但这里我们不用这个&#xff0c;我们自己来实现这个方法。 KMP算法的关键步骤&#xff1a; p[N]表示输入模式串&#xff0c;求取该模式串的ne[]数组。ne[i]表示前缀等于后缀的长度&…

电压放大器在电子实验中有哪些作用

电压放大器在电子实验中扮演着重要的角色&#xff0c;它可以实现对电压信号的放大&#xff0c;为实验提供所需的电压级别。下面是电压放大器在电子实验中的几个常见作用&#xff1a; 信号放大&#xff1a;电压放大器的主要作用是将输入信号的幅度放大&#xff0c;以便进行更准确…

AXI总线协议

总线&#xff1a;总线是传输数据的通道&#xff0c;由各种逻辑器件构成&#xff0c;一般由数据线、地址线、控制线等构成 接口&#xff1a;连接标准&#xff0c;又称之为物理接口i 协议&#xff1a;传输数据的规则 什么是AXI AXI(Advanced Extensible Interfece)是高级可扩展…

ModelCenter—多学科设计优化软件

产品概述 Ansys ModelCenter是美国Ansys公司旗下的一款产品&#xff0c;用于赋能工程师创建和自动化多工具工作流&#xff0c;优化产品设计。ModelCenter是一个创新的软件框架&#xff0c;可以灵活地满足基于模型的需求工程。在ModelCenter框架内工作&#xff0c;工程师能够将…

GDPU 数据结构 天码行空5

一、实验目的 1&#xff0e;掌握队列的顺序存储结构 2&#xff0e;掌握队列先进先出运算原则在解决实际问题中的应用 二、实验内容 仿照教材顺序循环队列的例子&#xff0c;设计一个只使用队头指针和计数器的顺序循环队列抽象数据类型。其中操作包括&#xff1a;初始化、入队…

安全典型配置(四)使用自反ACL实现单向访问控制案例

【微|信|公|众|号&#xff1a;厦门微思网络】 安全典型配置&#xff08;一&#xff09;使用ACL限制FTP访问权限案例_厦门微思网络的博客-CSDN博客 安全典型配置&#xff08;二&#xff09;使用ACL限制用户在特定时间访问特定服务器的权限-CSDN博客 安全典型配置&#xff0…

【Note】CNN与现代卷积神经网络part2(附Pytorch代码)

文章目录 1.4 多输入多输出通道1.4.1 多输入通道1.4.2 多输出通道1.4.3 11卷积层1.4.4 Summary 1.5 汇聚层1.5.1 最大汇聚层和平均汇聚层1.5.2 填充和步幅1.5.3 多个通道1.5.4 Summary 1.6 卷积神经网络&#xff08;LeNet&#xff09;1.6.1 LeNet1.6.2 模型训练1.6.3 Summary 本…

一篇文章让你两种方式调用星火大模型,搭建属于自己的“chatgpt”

申请 网址&#xff1a;星火大模型api注册链接 选择零元购 获取你专属的key、密钥、appid 方法1&#xff1a;使用jquery直接调用 html: //应用插件-此插件用于对url编码加密&#xff0c;资源包已经上传&#xff0c;审核通过后&#xff0c;会在顶部显示<script src"…

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

项目场景&#xff1a; 实现ElementUI中三级分类的功能&#xff0c;发现没有前端三级目录的二级目录可以新建三级目录&#xff0c;数据库中也有数据&#xff0c;但是无法在前端显示&#xff01;后端的接口没有返回数据库的数据。 问题描述 提示&#xff1a;这里描述项目中遇到…

MySQL数据库varchar字段求和出现精度丢失

问题描述 在MySQL数据库中&#xff0c;将varchar字段用于数值运算时&#xff0c;会将其转换为数值类型进行计算。然而&#xff0c;由于varchar字段的可变长度特性&#xff0c;可能存在数值精度丢失的问题。 我用varchar类型存储学生的分数&#xff0c;分数有两位小数&#xff…

新业务场景如何个性化配置验证码?

验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身份核验的功能&#xff0c;在保障账户安全方…