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

代码随想录第三天 | 链表

文章目录

    • 链表理论知识
        • 定义链表
        • 删除链表
    • Leetcode203 移除链表元素
        • 代码实现
    • Leetcode707 设计链表
        • 代码实现
        • 复杂度分析
        • 错误点
    • Leetcode206 反转链表
        • 新建链表
        • 双指针法

链表理论知识

链接: https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E9%93%BE%E8%A1%A8%E7%9A%84%E7%B1%BB%E5%9E%8B

定义链表
// 单链表的节点定义
struct ListNode {int data;  // 节点上存储的元素ListNode *next;  // 指向下一个节点的指针ListNode(int val) : data(val), next(nullptr) {}  // 节点的构造函数
};// 双链表的节点定义
struct DoublyLinkedListNode {int data;DoublyLinkedListNode  * prev;DoublyLinkedListNode  * next;DoublyLinkedListNode(int val): data(val), prev(nullptr), next(nullptr) {}
};// 新建一个节点
ListNode* head = new ListNode(5);
删除链表

需手动释放这个D节点,释放这块内存
链表的增添和删除都是O(1)操作,也不会影响到其他节点. 如果删除最后一个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)

// 删除头节点
ListNode * tmp = head;
head = head->next;
delete tmp;

Leetcode203 移除链表元素

链接: https://leetcode.cn/problems/remove-linked-list-elements/description/

代码实现
ListNode* removeElements(ListNode* head, int val) {// 循环删除满足要求的头节点while (head != nullptr && head->val == val) {ListNode * tmp = head;head = head->next;delete tmp;}ListNode* current_node = head;// 该循环内已经包含了最后一个节点需要删除的情况while (current_node != nullptr && current_node->next != nullptr) {if (current_node->next->val == val) {ListNode* tmp = current_node->next;current_node->next = current_node->next->next;delete tmp;} else {current_node = current_node->next;}}return head;
}

Leetcode707 设计链表

链接: https://leetcode.cn/problems/design-linked-list/description/

代码实现
class MyLinkedList {
public:struct ListNode {int val;ListNode * next;ListNode(int data): val(data), next(nullptr) {}};MyLinkedList() {}int get(int index) {if (index >= size_ || index < 0) {return -1;}ListNode* current_node = head_;while (index-- > 0) {current_node = current_node->next;}return current_node->val;}void addAtHead(int val) {ListNode * new_node = new ListNode(val);new_node->next = head_;head_ = new_node;size_++;}void addAtTail(int val) {ListNode * current_node = head_;if (current_node == nullptr) {addAtHead(val);return;}while (current_node->next != nullptr) {current_node = current_node->next;}ListNode * new_node = new ListNode(val);current_node->next = new_node;size_++;}void addAtIndex(int index, int val) {if (index > size_ || index < 0) {return;}if (head_ == nullptr || index == 0) {addAtHead(val);return;}ListNode * current_node = head_;while (--index > 0) {current_node = current_node->next;}ListNode * new_node = new ListNode(val);new_node->next = current_node->next;current_node->next = new_node;size_++;}void deleteAtIndex(int index) {if (index < 0 || index >= size_) {return;}if (index == 0) {ListNode * tmp = head_;head_ = head_->next;delete tmp;} else {ListNode *  current_node = head_;while (--index > 0) {current_node = current_node->next;}ListNode * tmp = current_node->next;current_node->next = current_node->next->next;delete tmp;}size_--;}// 打印链表void printList() const {ListNode* temp = head_;while (temp != nullptr) {std::cout << temp->val << " <-> ";temp = temp->next;}std::cout << "nullptr" << std::endl;}private:ListNode * head_{nullptr};int size_{0};
};/*** 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);*/
复杂度分析

时间复杂度:初始化消耗 O(1),get 消耗 O(index),addAtHead 消耗 O(1),addAtTail 消耗 O(n),其中 n 为链表当前长度,即 addAtHead,addAtTail 和 addAtIndex 已调用次数之和,addAtIndex 消耗 O(index)。

空间复杂度:所有函数的单次调用空间复杂度均为 O(1),总体空间复杂度为 O(n),其中 n 为 addAtHead,addAtTail 和 addAtIndex 调用次数之和。

错误点
  1. 在调用addAtIndex函数时, 多次向头部插入时出错, 除判断head_ == nullptr外还需要判断index == 0
  2. 插入和删除的while循环条件和get中的条件不同

Leetcode206 反转链表

链接: https://leetcode.cn/problems/reverse-linked-list/description/
代码随想录解析: https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html#%E6%80%9D%E8%B7%AF
时间复杂度: O(N)
空间复杂度: O(1)

新建链表

会造成内存浪费

双指针法

需特别注意, 在初始化prev和cur指针后, 需将prev->next更新为nullptr, 避免循环嵌套

ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head;}ListNode * prev = head;ListNode * cur = head->next;prev->next = nullptr;while (cur != nullptr) {ListNode * tmp = cur->next;cur->next = prev;prev = cur;cur = tmp;}return prev;
}

相关文章:

代码随想录第三天 | 链表

文章目录 链表理论知识定义链表删除链表 Leetcode203 移除链表元素代码实现 Leetcode707 设计链表代码实现复杂度分析错误点 Leetcode206 反转链表新建链表双指针法 链表理论知识 链接: https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.h…...

Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

putty中修改默认窗口大小和字体、字号

在WinSCP中调用putty&#xff0c;发现默认窗口太小&#xff0c;字号也很小&#xff0c;非常不友好。现在显示器都是1080p起步&#xff0c;所以很有必要修改之。 以中文版v0.70为例&#xff0c;方法&#xff1a; 1. 点击左上角图标 &#xff0c;选择下拉菜单中的“修改设置”&…...

Windows下网络编与ESP8266-WiFi通信(win32-API)

一、前言 络编程是指编写程序使不同计算机之间能够通过网络进行通信和数据交换。网络编程涉及使用网络协议和编程接口来建立、管理和终止网络上的数据通信。在这一领域中&#xff0c;TCP/IP协议族是核心组成部分&#xff0c;尤其TCP&#xff08;传输控制协议&#xff09;是面向…...

【Golang】golang安装一些依赖包时总是失败

Golang安装一些依赖包失败&#xff1a; 比如安装gin包&#xff1a;go get -u github.com/gin-gonic/gin 可能会报错&#xff1a;连接网络失败、超时等 这时可能需要修改go的环境配置&#xff0c;修改代理即可&#xff1a; go env -w GO111MO…...

ubuntu如何监控Xvfb虚拟显示器

在Ubuntu中监控Xvfb显示器主要涉及到使用VNC服务器来远程访问这个环境。以下是一些基本步骤&#xff1a; 安装Xvfb和相关工具: 使用apt安装Xvfb和x11vnc&#xff0c;x11vnc是一个VNC服务器&#xff0c;可以远程访问Xvfb创建的虚拟桌面环境。 sudo apt-get install xvfb sudo ap…...

小型需求管理软件盘点:8款功能强大的工具

本文介绍了以下8款工具&#xff1a;PingCode、Worktile、易得云、Ping、燃草、Gitee、Monday.com、Slack。 在现代企业管理中&#xff0c;需求管理一直是个让人头疼的问题&#xff0c;特别是对于小型企业来说&#xff0c;选择一款合适的需求管理软件往往比想象中更复杂。如果选…...

Labelme的安装与使用教程

文章目录 一、Labelme是什么&#xff1f;二、安装步骤1.新建虚拟环境2.安装Labelme3.Labelme的使用 三、json2yolo 一、Labelme是什么&#xff1f; Labelme是一个用于图像标注的开源工具&#xff0c;可以实现图像标注、语义分割、实例分割等。 本文记录一下labelme的安装与使…...

C#基础:数据库中使用Linq作分组处理(反射/直接分组)

目录 一、使用反射分组 二、不使用反射分组 三、调用示例 四、代码demo 一、使用反射分组 private static List<GroupList<T>> GetGroupList<T>(List<T> entities, string groupByProperty) {// 获取分组字段的类型var propertyInfo typeof(T).…...

Revite二次开发_使用WPF和WebView2制作一个访问网站的窗口

如果想在revit里打开网页&#xff0c;可以使用WebView2来实现&#xff0c;下面是一个代码示例。 也尝试过使用CefSharp&#xff0c;但由于Revit本身也使用了CefSharp&#xff0c;所以需要根据不同的Revit版本选择适合的CefSharp版本&#xff0c;比较麻烦&#xff0c;所以最好还…...

Java Spring Boot 连接数据库

要在Java Spring Boot应用程序中连接数据库&#xff0c;您需要遵循以下步骤&#xff1a; 1. 添加数据库依赖项&#xff1a;在您的Spring Boot项目中的pom.xml文件中添加数据库依赖项&#xff0c;例如MySQL或PostgreSQL等。例如&#xff0c;如果您要连接MySQL数据库&#xff0c;…...

Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景

消息队列中推模式和拉模式分别有哪些使用场景 消息队列的推模式&#xff08;Push&#xff09;和拉模式&#xff08;Pull&#xff09;各有不同的使用场景和优缺点。下面我会详细介绍这两种模式及其适用场景&#xff1a; 推模式&#xff08;Push&#xff09; 特点&#xff1a;…...

springboot jar是如何启动的

我们先来看一个项目的打完包后的MANIFEST.MF文件&#xff1a; Manifest‐Version: 1.0 Implementation‐Title: spring‐learn Implementation‐Version: 0.0.1‐SNAPSHOT Start‐Class: com.tulingxueyuan.Application Spring‐Boot‐Classes: BOOT‐INF/classes/ Spring‐Bo…...

Android 12系统源码_屏幕设备(二)DisplayAdapter和DisplayDevice的创建

前言 在Android 12系统源码_屏幕设备&#xff08;一&#xff09;DisplayManagerService的启动这篇文章中我们具体分析了DisplayManagerService 的启动流程&#xff0c;本篇文章我们将在这个的基础上具体来分析下设备屏幕适配器的创建过程。 一、注册屏幕适配器 系统是在Disp…...

常用Mysql命令

前言 本文列举了一些常见的mysql操作 正文 一、连接和登录 MySQL 1. 使用命令行登录 MySQL 注意&#xff1a;需要将mysql的bin目录导入到环境变量中 mysql -u 用户名 -p示例&#xff1a; mysql -u root -p执行上述命令后&#xff0c;系统会提示输入密码&#xff0c;输入…...

IDEA Debug工具

一、Debug工具栏 自定义debug工具栏&#xff1a;先把debug程序运行起来->右击->配置 常用的工具&#xff1a; 二、DeBug常用图标详解 三、DeBug实践操作 常规Debug&#xff1a;略。 Stream Chain&#xff1a;处理流式语句 Reset Frame&#xff1a;重置方法入栈 …...

ARM64的汇编资源

最近在写一本ARM64的教材&#xff0c;所以在晚上查找了一下相关资源&#xff0c;都是免费开源的&#xff0c;不包括盗版书籍。 Exploring AArch64 assembler Roger Ferrer Ibez的博客文章&#xff0c;写在2016-2017年&#xff0c;内容简单充实&#xff0c;适合入门。 《ARM6…...

实验室安全分级分类管理系统在高校中的具体应用

盛元广通高校实验室安全分级分类管理系统的构建&#xff0c;旨在通过科学合理的管理手段&#xff0c;提高实验室的安全水平&#xff0c;保障师生的人身安全&#xff0c;防止实验事故的发生。这一系统通常包括实验室安全等级评估、分类管理、风险控制、安全教育与培训、应急响应…...

使用 prerenderRoutes 进行预渲染路由

title: 使用 prerenderRoutes 进行预渲染路由 date: 2024/8/20 updated: 2024/8/20 author: cmdragon excerpt: prerenderRoutes 函数是 Nuxt 3 中一个强大的工具,它能够帮助开发者优化页面加载速度和改善用户体验。通过使用 prerenderRoutes,你能够灵活地指定需要预渲染的…...

【深度解析】WRF-LES与PALM微尺度气象大涡模拟

查看原文>>>【深度解析】WRF-LES与PALM微尺度气象大涡模拟 针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...

AT模式下的全局锁冲突如何解决?

一、全局锁冲突解决方案 1. 业务层重试机制&#xff08;推荐方案&#xff09; Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减&#xff08;自动加全…...

React与原生事件:核心差异与性能对比解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

DJango知识-模型类

一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...

Python爬虫:trafilatura 的详细使用(快速提取正文和评论以及结构,转换为 TXT、CSV 和 XML)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、trafilatura 概述1.1 trafilatura介绍1.2 亮点特色1.3 安装二、基本使用2.1 从URL直接提取内容2.2 输出格式控制2.3 从HTML字符串提取2.4 使用命令行工具三、高级功能3.1 全局设置3.2 提取参数定制3.3 多线程批量处…...

api将token设置为环境变量

右上角 可以新增或者是修改当前的环境 环境变量增加一个token,云端值和本地值可以不用写 在返回token的接口里设置后执行操作&#xff0c;通常是登录的接口 右侧也有方法提示 //设置环境变量 apt.environment.set("token", response.json.data.token); 在需要传t…...