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

代码随想录刷题题Day3

刷题的第三天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++ / Python
Day3 任务
● 链表理论基础
● 203.移除链表元素
● 707.设计链表
● 206.反转链表

1 链表理论基础

链表:通过指针串联在一起的线性结构,每个节点由指针域数据域组成。
指针域:存放指向下一个节点的指针,最后一个节点的指针域指向null
数据域:节点存放着数据

(1)链表的类型

  1. 单链表
    每个节点的指针域指向下一个节点
    在这里插入图片描述
  2. 双链表
    每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点

可以双向查询

在这里插入图片描述

  1. 循环链表
    链表首尾相连,可以用来解决约瑟环问题
    在这里插入图片描述

(2)链表的存储方式
链表在内存中不是连续分布的(区别于数组)

通过指针域的指针链接内存中的各个节点,散乱分布在内存的某地址上,分配机制取决于操作系统的内存管理

(3)链表的定义
C++的定义链表节点方式

struct ListNode
{int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {}
};

如果不自己定义构造函数初始化节点:

ListNode* head = ListNode();
head->val = 5;

采用上面自己定义的构造函数初始化节点可以直接给变量赋值:

ListNode* head = ListNode(5);

Python的定义链表节点方式

class ListNode:def __init__(self, val, next=None):self.val = valself.next = next

(4)链表的操作

  1. 删除节点
    在这里插入图片描述

将C节点的指针指向E,就间接删除了D,C++需要自己手动释放内存,Python不需要自己手动释放内存

  1. 添加节点
    在这里插入图片描述

C节点指向新节点,新节点指向D节点,就完成了在C和D节点之间插入了新节点。

(5)链表与数组的区别

  • 数组在定义的时候,长度是固定的,如果需要改变数组的长度,需要重新定义一个新的数组
  • 链表的长度可以是不固定的,动态增删,适合数据量不固定,频繁增删,少查询的场景
插入/删除查询适用场景
数组O(n)O(1)数据量固定,频繁查询,较少插入和删除的场景
链表O(1)O(n)数据量不固定,较少查询,频繁插入和删除的场景

2 移除链表元素

在这里插入图片描述

C++编程语言需要自己手动删除清理节点的内存
Python就不用手动管理内存了

😀因为单链表的特殊性,只能指向下一个节点,如果删除的是头节点怎么办?如何让头节点的前一个节点指向头节点的下一个节点。

有两种处理方式:
(1)直接使用原来的链表进行删除操作:分两步操作1.删除头节点2.删除除了头节点的其他节点
在这里插入图片描述
只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点,依然别忘将原头结点从内存中删掉在这里插入图片描述
在这里插入图片描述

(2)设置一个虚拟头节点进行删除操作 : 原链表的所有节点就都可以按照统一的方式进行移除了
在这里插入图片描述

  1. 直接使用原来的链表来进行移除节点操作
    在这里插入图片描述

C++:

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {// 删除头节点while (head != NULL && head->val == val){ListNode* tmp = head;head = head->next; // 让下一个节点作为头节点delete tmp;}// 删除非头节点ListNode* cur = head;while (cur != NULL && cur->next != NULL){if (cur->next->val == val){ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;}else{cur = cur->next;}}return head;}
};

Python:

class Solution(object):def removeElements(self, head, val):""":type head: ListNode:type val: int:rtype: ListNode"""while head != None and head.val == val:head = head.nextcur = headwhile cur != None and cur.next != None:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn head
  1. 设置一个虚拟头结点在进行移除节点操作
    在这里插入图片描述

C++:

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummyhead = new ListNode(0);dummyhead->next = head;ListNode* cur = dummyhead;while (cur->next != NULL){if (cur->next->val == val){ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;}else{cur = cur->next;}}head = dummyhead->next;delete dummyhead;return head;}
};

Python:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):def removeElements(self, head, val):""":type head: ListNode:type val: int:rtype: ListNode"""dummyhead = ListNode(next = head)cur = dummyheadwhile cur.next:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummyhead.next

3 设计链表

在这里插入图片描述

实现 MyLinkedList 类:

class MyLinkedList 
{};

链表定义:

struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {}
};

定义两个私有成员:

private:int _size;ListNode* _dummyhead; // 虚拟头节点
  1. MyLinkedList() 初始化 MyLinkedList 对象。
MyLinkedList()
{_dummyhead = new ListNode(0);_size = 0;
}
  1. int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
int get(int index) {if (index < 0 || index > size - 1) return -1;ListNode* cur = _dummyhead->next;while (index--){cur = cur->next;}return cur->val;
}
  1. void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtHead(int val) {ListNode* newNode = new ListNode(val);newNode->next = _dummyhead->next;_dummyhead->next = newNode;_size++;
}
  1. void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtTail(int val) {ListNode* cur = _dummyhead;ListNode* newNode = new ListNode(val);while (cur->next != NULL){cur = cur->next;}cur->next = newNode;_size++;
}
  1. void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void addAtIndex(int index, int val) {if (index < 0) index = 0;if (index > _size) return;ListNode* newNode = new	ListNode(val);ListNode* cur = _dummyhead;while (index--){cur = cur->next;}newNode->next = cur->next;cur->next = newNode;_size++;
}
  1. void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。
void deleteAtIndex(int index) {if (index < 0 || index >= _size) return;ListNode* cur = _dummyhead;while (index--){cur = cur->next;}ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp = NULL;_size--;
}

C++:

class MyLinkedList {
public:
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {}
};MyLinkedList() {_dummyhead = new ListNode(0); // 虚拟头结点_size = 0;}// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点int get(int index) {if (index < 0 || index > _size - 1) return -1;ListNode* cur = _dummyhead->next;while (index--)// 如果--index 就会陷入死循环{cur = cur->next;}return cur->val;}// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点void addAtHead(int val) {ListNode* newNode = new ListNode(val);newNode->next = _dummyhead->next;_dummyhead->next = newNode;_size++;}// 在链表最后面添加一个节点void addAtTail(int val) {ListNode* newNode = new ListNode(val);ListNode* cur = _dummyhead;while(cur->next != NULL){cur = cur->next;}cur->next = newNode;_size++;}void addAtIndex(int index, int val) {if (index < 0) index = 0; // 如果index小于0,则在头部插入节点if (index > _size) return; // 如果index大于链表的长度,则返回空ListNode* newNode = new ListNode(val);ListNode* cur = _dummyhead;while (index--){cur = cur->next;}newNode->next = cur->next;cur->next = newNode;_size++;}// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的void deleteAtIndex(int index) {if (index >= _size || index < 0) return;ListNode* cur = _dummyhead;while (index--){cur = cur->next;}ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp = NULL;_size--;}
private:int _size;ListNode* _dummyhead;
};

4 反转列表

在这里插入图片描述
(1)双指针
只需要改变链表的next指针的指向,直接将链表反转
在这里插入图片描述
在这里插入图片描述
伪代码:

cur = head;
pre = NULL;
// 移动pre和cur指针 注意下面的逻辑顺序
while (cur != NULL)
{tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;
}
return pre; // 返回头节点

C++:

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* cur = head;ListNode* pre = NULL;while (cur != NULL){ListNode* tmp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->nextcur->next = pre;// 翻转// 更新pre 和 cur指针pre = cur;cur = tmp;}return pre;}
};

Python:

class Solution(object):def reverseList(self, head):""":type head: ListNode:rtype: ListNode"""cur = headpre = Nonewhile cur != None:tmp = cur.nextcur.next = prepre = curcur = tmpreturn pre

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
(2)递归
相对抽象,和双指针法是一样的逻辑
C++:

class Solution {
public:ListNode* reverse(ListNode* pre, ListNode* cur){if (cur == NULL) return pre;ListNode* tmp = cur->next;cur->next = pre;// pre = cur;// cur = temp;return reverse(cur, temp);}ListNode* reverseList(ListNode* head) {// 和双指针法初始化是一样的逻辑reverse(NULL, head);}
};

Python:

class Solution(object):def reverseList(self, head):return self.reverse(head,None)def reverse(self, cur, pre):if cur == None:return pretmp = cur.nextcur.next = prereturn self.reverse(tmp, cur)

今天真是搞了不少时间,鼓励坚持三天的自己😀😀😀

相关文章:

代码随想录刷题题Day3

刷题的第三天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day3 任务 ● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 1 链表理论基础 链表&#xff1a;通过…...

GO学习之 单例模式 sync.Once

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

应用安全四十三:无密码认证安全

什么是无密码认证&#xff1f; 无密码认证是一种新兴的安全技术和身份认证手段&#xff0c;是用密码以外的东西验证软件用户身份的过程&#xff0c;旨在替代传统的用户账号和密码认证方法&#xff0c;提高账号的安全性和用户体验。无密码技术通过生物识别、多因素认证、基于硬…...

Lattice-Based Blind Signatures: Short, Efficient, and Round-Optimal

目录 摘要引言 Lattice-Based Blind Signatures: Short, Efficient, and Round-Optimal CCS 2023 摘要 我们提出了一种基于随机预言机启发式和标准格问题&#xff08;环/模块SIS/LWE和NTRU&#xff09;的2轮盲签名协议&#xff0c;签名大小为22KB。该协议是全面优化的&#xf…...

Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道

一、前言 对各种音视频文件格式的支持&#xff0c;是一个播放器的基础功能。一般的音视频文件只有1路流&#xff0c;比如音频文件只有1路音频流&#xff0c;视频文件只有1路音频1路视频流&#xff0c;实践过程中发现&#xff0c;还有一种ts格式的文件&#xff0c;可能有多路流…...

深度学习之基于Django文本情感分析识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在文本情感分析领域的应用已经取得了显著的进展。Django是一个流行的Python Web框架&#xff0c;它可以帮助…...

138. 随机链表的复制 --力扣 --JAVA

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点…...

Python Flask 框架开发

1. Python 代码示例&#xff08;使用 Flask 框架&#xff09; 1.1 安装依赖库 pip install flask flask_sqlalchemy flask_login flask_wtf 1.2 主应用文件 app.py from flask import Flask, request, jsonify, redirect, url_for, render_template, flash from flask_sqla…...

k8s安装-学习环境

目录 环境准备 配置hosts 关闭防火墙 关闭交换分区 调整swappiness参数 关闭setlinux Ipv4转发 时钟同步 安装Docker 配置Yum源 安装 配置 启动 日志 安装k8s 配置Yum源 Master节点 安装 初始化 配置kubectl 部署CNI网络插件 Node节点 检查 环境准备 准…...

Vue3动态表单

示例代码如下&#xff1a; // 引入需要的依赖包 import { ref, reactive } from vue; import { useForm } from /composables/useForm;// 定义表单数据模型 const formModel reactive({name: ,age: ,gender: , });// 使用自定义的useForm函数创建表单实例 const { register, …...

2312skia,15vulkan及技巧

ANGLE介绍 ANGLE,把OpenGLES2或3调用转换为DirectX9,11或OpenGL调用.这些说明记录了如何在Windows或Linux上使用ANGLE而不是本地OpenGL后端. 细节 gclient sync下载ANGLE的源码及Skia的其他仅测试依赖项. 要针对ANGLE构建Skia测试工具,请添加skia_use_angletrue到args.gn文件…...

TLSF算法概念,原理,内存碎片问题分析

TLSF算法介绍 TLSF&#xff08;Two-Level Segregated Fit&#xff0c;两级分割适应算法&#xff09;。 第一级&#xff08;first level,简称fl&#xff09;&#xff1a;将内存大小按2的幂次方划分一个粗粒度的范围&#xff0c;如一个72字节的空闲内存的fl是6&#xff08;72介…...

sharding-jdbc实现分库分表

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 &#x1f605;&#x1f605;最近几天的状态有点不对&#xff0c;所以有几天没有更新了。 当我们的数据量比较大…...

JDK中lock锁的机制,其底层是一种无锁的架构实现的,公平锁和非公平锁

简述JDK中lock锁的机制&#xff0c;其底层是一种无锁的架构实现的&#xff0c;是否知道其是如何实现的 synchronized与lock lock是一个接口&#xff0c;而synchronized是在JVM层面实现的。synchronized释放锁有两种方式&#xff1a; 获取锁的线程执行完同步代码&#xff0c;…...

c++通过serial库进行上下位机通信

​编辑 风紊 现役大学牲&#xff0c;半退休robomaster视觉队员 写在前面 本文章主要介绍的是如何通过开源的serial库和虚拟串口实现上位机和下位机通信。 需求 假设下位机有这样一个数据报发送给上位机 struct DataRecv {char start s;TeamColor color TeamColor::Blu…...

【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…...

指针常量和常量指针的区别

文章目录 指针常量常量指针即是指针常量又是常量指针 指针常量 指针常量的本质是常量&#xff0c;表示的是 这个指针所指向的地址不能发生改变。即指针变量的值&#xff08;即地址值&#xff09;不能发生修改。但是指针所指向的那块内存里的值是可以修改的。 注意&#xff1a;…...

离散化算法总结

离散化是将大范围的数字映射到小范围的区间内&#xff0c;适用于稀疏的区间。 两个问题需要考虑&#xff1a; 1. 原数组中可能有重复元素&#xff0c;需要去重。 2. 如何算出离散化后的值&#xff08;离散化后保序&#xff0c;使用二分&#xff09;。 题目链接&#xff1a; …...

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

逻辑卷管理器lvm

啥意思&#xff0c;个人理解就是可以将物理分区合并一起组成大的磁盘&#xff0c;也可以移除其中的某个分区。 有四个概念需要了解下 PV&#xff0c;物理卷&#xff0c;VG 卷用户组&#xff0c;PE物理扩展块&#xff0c;LV逻辑卷 p物理&#xff0c;v卷&#xff0c;g用户组&a…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...