【Leetcode】 707. 设计链表

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

单链表中的节点应该具备两个属性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.rhkb.cn/news/162116.html

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

相关文章

保序回归与金融时序数据

保序回归在回归问题中的作用是通过拟合一个单调递增或递减的函数&#xff0c;来保持数据点的相对顺序特性。 一、保序回归的作用 主要用于以下情况&#xff1a; 1. 有序数据&#xff1a;当输入数据具有特定的顺序关系时&#xff0c;保序回归可以帮助保持这种顺序关系。例如&…

rust学习—— 控制流if 表达式

控制流 根据条件是否为真来决定是否执行某些代码&#xff0c;或根据条件是否为真来重复运行一段代码&#xff0c;是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。 if 表达式 if 表达式允许根据条件执行不同的代码分支。你提供…

vue-cli脚手架创建项目时报错Error: command failed: npm install --loglevel error

项目背景 环境&#xff1a;vue-cli 5.x 在工程文件中&#xff0c;后端模块wms已经创建完成&#xff0c;现在想新建一个名为vue-web的前端模块 执行命令vue create vue-web时&#xff0c; 报错Error: command failed: npm install --loglevel error 问题分析及解决 排查过程…

Linux性能优化--使用性能工具发现问题

9.0 概述 本章主要介绍综合运用之前提出的性能工具来缩小性能问题产生原因的范围。阅读本章后&#xff0c;你将能够&#xff1a; 启动行为异常的系统&#xff0c;使用Linux性能工具追踪行为异常的内核函数或应用程序。启动行为异常的应用程序&#xff0c;使用Linux性能工具追…

centos 7.9 源码安装htop

1.下载源码 wget http://sourceforge.net/projects/htop/files/latest/download 2.上传到tmp目录&#xff0c;并解压 tar xvzf htop-1.0.2.tar.gz mv htop-1.0.2 /opt/ 进入到 cd /opt/htop-1.0.2/ 3.编译并安装 ./configure && make && make install 4.…

基于混沌博弈优化的BP神经网络(分类应用) - 附代码

基于混沌博弈优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于混沌博弈优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.混沌博弈优化BP神经网络3.1 BP神经网络参数设置3.2 混沌博弈算法应用 4.测试结果…

什么是CSGO大行动,2023年CSGO大行动时间预测

什么是CSGO大行动&#xff0c;2023年CSGO大行动时间预测 什么是CSGO大行动&#xff0c;2023年CSGO大行动时间预测 那天群里在提大行动&#xff0c;不明所以的新同学在问&#xff0c;什么是大行动&#xff0c;是不是官方红锁大行动要来了&#xff1f;当然不是&#xff0c;别自己…

Linux内核的.config 配置文件和defconfig 配置文件

Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面&#xff0c;menuconfig 是一套图形化的配置工具 一、图形化界面的操作 menuconfig 图形化的配置工具需要 ncurses 库支持。ncurses 库提供了一系列的 API 函数供调用者生成基于文本的图形界面&#xff0c;因此…

c++_learning-基础部分

文章目录 基础认识&#xff1a;语言特性&#xff08;面向对象编程&#xff09;&#xff1a;c的类&#xff08;相当于c中的结构体&#xff09;&#xff1a;三大特性&#xff1a;c包含四种编程范式&#xff1a;优缺点&#xff1a; c程序编译的过程&#xff1a;预处理->编译&am…

《软件方法》第1章2023版连载(07)UML的历史和现状

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.3 统一建模语言UML 1.3.1 UML的历史和现状 上一节阐述了A→B→C→D的推导是不可避免的&#xff0c;但具体如何推导&#xff0c;有各种不同的做法&#xff0c;这些做法可以称为“方…

WebDAV之π-Disk派盘 + 密码键盘

密码键盘是一款密码管理器,可以存储和管理需要受保护的数据。为方便日常使用,同时也是一款安全输入法,帮您安全便捷地填写账号密码、通用内容、卡包信息。 密码键盘使用军事级的 PBKDF2 有损加密算法保护您的根密码,使用军事级的 AES 加密算法保护您的存储数据。云端再额外…

VBA之正则表达式(43)-- 从网页中提取指定数据

实例需求&#xff1a;由网页中提取下图中颜色标记部分内容&#xff0c;网页中其他部分与此三行格式相同。 方法1 Sub Demo()Dim objRegex As ObjectDim inputString As StringDim objMatches As ObjectDim objMatch As ObjectSet objRegex CreateObject("VBScript.RegEx…

为什么不可大张旗鼓地推动“汉字编程”?

为什么不可大张旗鼓地推动“汉字编程”&#xff1f; 没有不可。 我之前看到过一个vscode插件&#xff0c;是给一个不知道叫什么名字的编程语言用的&#xff0c;从代码到注释全是西里尔字母写的&#xff0c;反正就只有东欧那片区域用。最近很多小伙伴找我&#xff0c;说想要一些…

2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]

自动驾驶卡车的技术原理是通过电脑算法控制车辆行驶&#xff0c;辅助驾驶员完成任务。其实现方式主要是基于传感器和计算处理技术。自动驾驶卡车可以随时感知周围环境&#xff0c;灵活避障&#xff0c;自适应调整行驶路径&#xff0c;相比之下传统卡车需要驾驶员进行手动操作&a…

使用postman做接口测试

1.接口测试&#xff1a;针对软件对外提供服务的接口的输入输出进行测试&#xff0c;以及接口间相互逻辑的测试&#xff0c;验证接口功能与接口描述文档的一致性 2.接口测试流程&#xff1a; 1&#xff09;获取接口信息&#xff1a;通过接口文档或抓包来获取接口的基本调用方式和…

C# 取消一个不带CancellationToken的任务?

在异步函数中&#xff0c;一般使用CancellationToken来控制函数的执行。这个Token需要作为参数传递到异步函数中&#xff1a; public staic Task<T> DoAsync(CancellationToken token) {... } 那么如果一个异步函数没有这个Token参数&#xff0c;如何取消呢? 之前看到一…

Dasviewer浏览器里显示模型裁剪不成功,输出无数据是什么原因?

答&#xff1a;Metadata文件需要先放在Terraosgb文件夹瓦块再试试 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。#DasViewer##…

JAVA基础(JAVA SE)学习笔记(三)流程控制语句

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 JAVA基础&#xff08;JAVA SE&#xff09;学习笔记&#xff08;一&#xff09;JAVA学习路线、行业了解、…

git 使用

参考 https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%8E%B7%E5%8F%96-Git-%E4%BB%93%E5%BA%93 文件的状态变化周期 文章目录 git 基础检查当前文件状态、查看已暂存和未暂存的修改暂存前后的变化跟踪新文件提交更新移除文件移动文件、重命名操作查看提交历史撤消…

企业c#语言源代码防泄密解决方案

在当今数字化时代&#xff0c;企业的核心业务往往依赖于软件应用程序。为了保护企业的知识产权和敏感信息&#xff0c;源代码的保密至关重要。对于制造类企业尤其是智能制造业来讲&#xff0c;最近几年是高速发展的时期&#xff0c;很多公司在做工厂流水线设备时&#xff0c;就…