【C++ 数据结构:链表】二刷LeetCode707设计链表
【C++链表】
使用c++重新写一遍LeetCode707设计链表
目的是熟悉c++中链表的操作
知识点
C++链表节点的实现
在c++中,一般通过结构体来定义链表的节点,也需要写构造函数(使用初始化列表)
如:
struct ListNode{
int val;
ListNode* next;
//要写构造函数
//结构体中的构造函数要用初始化列表来初始化属性
ListNode(int val) :val(val), next(nullptr){}
};
访问节点中的属性遵循结构体指针操作
即利用操作符 ->
可以通过结构体指针访问结构体属性
例如,遍历链表
while(cur->next != nullptr){
cur = cur->next;
}
实现一个链表节点
c++中对于链表的操作均通过指针完成,例如:
//创建一个待插入的节点
ListNode* node4add = new ListNode(val);
上述代码在堆区开辟一块新内存存放一个ListNode对象,将指针node4add指向该区域
内存释放
在c++中操作节点,如果不再需要某个节点,一定要把该节点删除(释放内存)
例如删除节点的操作中,我们将待删除节点的上一个节点指向待删除节点的后一个节点,绕过了待删除节点,实现对该节点的删除
如果是其他语言,就直接操作就行了,在c++中不行
我们还需要将待删除节点保存下来,再删除释放
void deleteAtIndex(int index) {
if(index < 0 || index >= m_size){
return;
}
//将当前指针指向dummy
ListNode* cur = m_dummy;
while(index){
cur = cur->next;
index--;
}
//要先把待删除的节点用临时节点保存,以便之后进行delete操作
//如果不删除的话会报错
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
m_size--;
}
完整代码
class MyLinkedList {
public:
//要先定义一个结构体作为节点
struct ListNode{
int val;
ListNode* next;
//要写构造函数
//结构体中的构造函数要用初始化列表来初始化属性
ListNode(int val) :val(val), next(nullptr){}
};
MyLinkedList() {
//初始化(定义/实现)链表的头节点和size
//实际上这两个属于MyLinkedList类的成员属性,由于我们不想其被修改
//因此可以把它们写在private区
m_size = 0;
m_dummy = new ListNode(0);//在堆区开辟一块新内存存放一个ListNode对象,将指针m_dummy指向该区域
}
int get(int index) {
if (index > (m_size - 1) || index < 0) {
return -1;
}
//将当前指针指向头节点(即dummy的下一个)
// ListNode* cur = m_dummy->next;
ListNode* cur = m_dummy;
while(index){
cur = cur->next;
index--;
}
return cur->next->val;//记得返回的是cur的下一个节点,因为最初cur指向的是dummy
//要么一开始就让cur指向dummy->next
}
void addAtHead(int val) {
//创建一个待插入的节点
ListNode* node4add = new ListNode(val);
node4add->next = m_dummy->next;
m_dummy->next = node4add;
m_size++;
}
void addAtTail(int val) {
//创建一个待插入的节点
ListNode* node4add = new ListNode(val);
ListNode* cur = m_dummy;
//遍历到链表末尾处
while(cur->next != nullptr){
cur = cur->next;
}
//插入新节点
cur->next = node4add;
m_size++;
}
// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点
// 如果index大于链表的长度,则返回空
// 如果index小于0,则在头部插入节点
void addAtIndex(int index, int val) {
if(index > m_size){
return;
}else if(index < 0){
index = 0;
}
//将当前指针指向dummy
ListNode* cur = m_dummy;
//遍历到index位置
while(index){
cur = cur->next;
index--;
}
//找到插入位置之后开始插入
//创建一个待插入的节点
ListNode* node4add = new ListNode(val);
node4add->next = cur->next;
cur->next = node4add;
//链表长度增加
m_size++;
}
void deleteAtIndex(int index) {
if(index < 0 || index >= m_size){
return;
}
//将当前指针指向dummy
ListNode* cur = m_dummy;
while(index){
cur = cur->next;
index--;
}
//要先把待删除的节点用临时节点保存,以便之后进行delete操作
//如果不删除的话会报错
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
m_size--;
}
private:
int m_size;//声明链表长度
ListNode* m_dummy;//声明dummy头节点
};
/**
* 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);
*/
707二刷错误点
1、忘记处理链表size
记得定义链表长度size
2、next的含义
举个例子
void addAtIndex(int index, int val) {
if(index > m_size){
return;
}else if(index < 0){
index = 0;
}
//将当前指针指向dummy
ListNode* cur = m_dummy;
//遍历到index位置
while(index){
cur = cur->next;
index--;
}
//找到插入位置之后开始插入
//创建一个待插入的节点
ListNode* node4add = new ListNode(val);
node4add->next = cur->next;
cur->next = node4add;
//链表长度增加
m_size++;
}
这里node4add->next = cur->next;
的意思是:
node4add节点的下一个节点指向cur的下一个节点A,此时cur->next代表的是一个节点
而cur->next = node4add;
的意思是:
cur的下一个节点指向node4add节点,此时cur->next表示访问cur节点的next属性并对其进行操作
3、get函数,要注意cur的指向
代码注释有说明,在用dummy节点的时候不要搞错返回对象
【C++ 数据结构:链表】二刷LeetCode707设计链表的更多相关文章
- LeetCode707 设计链表
设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...
- [Swift]LeetCode707. 设计链表 | Design Linked List
Design your implementation of the linked list. You can choose to use the singly linked list or the d ...
- 自己动手实现java数据结构(二) 链表
1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是, ...
- SDUT OJ 数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- LeetCode707:设计链表 Design Linked List
爱写bug (ID:iCodeBugs) 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/ ...
- SDUT-2117_数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入整数个数N,再输入N个整数,按照 ...
- 数据结构作业——P53页算法设计题(7):原地逆转链表
一. 题目描述: 设计一个算法,将链表中所有结点的链接方向"原地"逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1). 二.算法设计 #include< ...
- Leetcode707.Design Linked List设计链表
设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...
- 数据结构和算法之单向链表二:获取倒数第K个节点
我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...
- JavaScript 版数据结构与算法(三)链表
今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...
随机推荐
- SpringBoot自动配置(装配)流程
源码分析 SpringBoot自动配置流程 首先,我们要了解在@SpringBootApplication注解的内部,还具有@EnableAutoConfiguration,@SpringBo ...
- 构建LNP镜像
1.构建ubuntu-base环境 #10.0.0.28: [root@rocky8 ubuntu_base]#vim Dockerfile FROM ubuntu:20.04 LABEL m ...
- Modbus协议及python库实现
基础知识 硬件层协议:解决0和1的可靠传输,常有RS232.RS485.CAN.IIC.SPI - 软件层协议:解决传输目的,常有Modbus.TCP/IP.CANopen - 协议优点: Modbu ...
- hyperworks2021位安装教程
hyperworks2021位安装教程:1.先使用"百度网盘客户端"下载hw21_EN_x64软件安装包到电脑磁盘英文路径文件夹下,并鼠标右击进行解压缩,然后在文件夹内找到hwDe ...
- hwlog---huawei.com/npu-exporter/utils---utils.go
// Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package utils offer the so ...
- Go语言核心36讲45
你好,我是郝林,我今天继续分享bufio包中的数据类型. 在上一篇文章中,我提到了bufio包中的数据类型主要有Reader.Scanner.Writer和ReadWriter.并着重讲到了bufio ...
- MongoDB - 索引知识
索引简介 什么是索引 索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录. 索引支持 MongoDB 查询的高效执行.如果没有索引,MongoDB 必须扫描集合中每一个文档,以选择与查询语句 ...
- 干电池升压3.3V芯片
PW5100适用于一节干电池升压到3.3V,两节干电池升压3.3V的升压电路,PW5100干电池升压IC. 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试: PW ...
- 浏览器内存漫游解决方案(js逆向)
//浏览器内存漫游解决方案(js逆向) //原理通过ast把所有的变量,参数中间值进行内存的存储 //搜索AST-hook,进入github //现在github的库下载下来 //anyproxy n ...
- 使用pandas处理数据和matplotlib生成可视化图表
一.缘由 上一篇输入关键词"口红",将淘宝中的的相关商品信息全部爬取了下拉,并且以CSV的文件格式储存.我们拿到数据之后,那么就需要对数据进行处理.只是将爬取到的数据以更直观的方式 ...