代码随想录刷题题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;
};

Python:
今天有事耽搁了,导致晚上整理时间比较久,明天早上再写一遍。😀😀😀

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:

时间复杂度: 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:


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

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

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

相关文章

卷积神经网络(VGG-16)猫狗识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 再次检查数据3. 配置数据集4. 可视化数据 三、构建VG-16网络四、编译五、训练模型六、模型评估七、保存and加载模型八、预测…

笔记----单纯剖分----1

笔记----单纯剖分 定义 线性组合仿射组合&#xff1a; 线性组合的系数为1凸组合&#xff1a; 仿射组合所有的系数都是正数 凸集 R^m 的 任意有限个点的凸组合仍在其中的子集仿射子空间 R^m 的 任意有限个点的仿射组合仍在其中的子集凸包 conv(A) A是R^m的一个子集 A的所有有限凸…

Rust语言项目实战(二) - 准备键盘和终端屏幕

上一章节中&#xff0c;我们实现了游戏开始音频的播放&#xff0c;本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的&#xff0c;因此编写的界面也是终端中展示的界面&#xff0c;上一章中&#xff0c;我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先…

Valentina Studio Pro:引领数据库管理软件新潮流

你是否正在寻找一款强大且易用的数据库管理软件&#xff1f;Valentina Studio Pro可能就是你的不二之选。这款软件是由Valentina Team开发的一款综合性数据库管理和编辑工具&#xff0c;它支持多种数据库系统&#xff0c;包括MySQL、PostgreSQL、SQLite等。 Valentina Studio …

java调用mysql存储过程

一、背景 在mysql上定义了存储过程&#xff0c;然后我想每1分钟调用一次存储过程。于是我设置了一个event&#xff0c;但是这个事件默认的运行周期为天&#xff0c;我尝试修改成minute却不生效。所以我决定通过java代码来调用存储过程。 二、mysql存储过程 CREATE DEFINERroot…

cpu版本的torch可以用清华镜像源安装

一、来到pytroch官网找到如下代码 官方提供的默认的安装cpu版本的torch的命令 pip3 install torch torchvision torchaudio二、使用清华镜像安装 pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德&#xff08;Everton Gomede&#xff09; 一、介绍 自然语言处理 &#xff08;NLP&#xff09; 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它&#xff0c;将这个概念分解成它的基本组成部分是至关重要的&#xff1a;组合语义及其在NLP中的应用。组…

零售数字化“逆熵”的6项原则和8种能力建设|ShopeX徐礼昭

作者&#xff1a;徐礼昭 来源&#xff1a;《三体零售逆熵法则》节选 旧的规则与秩序被打破&#xff0c;无序成为常态 新时代洪流裹挟冲击着传统零售 无序带来的“熵增”侵蚀企业生命 所有人都在不确定性中寻找确定 数字化如何助力企业铸就「反熵增」神器&#xff1f; 如何…

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识&#xff0c;可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

设计模式之美学习笔记-单例模式-为什么说支持懒加载的双重检测不比饿汉式更优?

单例设计模式&#xff1a;一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类&#xff0c;这种设计模式就叫作单例设计模式&#xff0c;简称单例模式。 实战案例一&#xff1a;处理资源访问冲突 我们先来看第一个例子。在这个例子…

第十节HarmonyOS 常用基础组件-Image

一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;基础组件…

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…

海外IP罗拉rola正版去哪里找?

免费海外IP代理能用吗&#xff1f;和收费的有哪些差异&#xff1f; 如今在这个大数据时代&#xff0c;无论你从事哪个行业&#xff0c;都离不开数据&#xff0c;尤其是做跨境电商的&#xff0c;更一步都离不开海外IP代理&#xff0c;无论是网站引擎优化还是营销推广、数据抓取…

LeetCode105.从前序和中序遍历序列构造二叉树

这道题看完题想了几分钟就想到大概的思路了&#xff0c;但是在写的时候有很多细节没注意出了很多问题&#xff0c;然后写了1个多小时&#xff0c;其实这道题挺简单的。 首先&#xff0c;最基本的知识&#xff0c;先序遍历是根左右&#xff0c;中序遍历是左根右&#xff0c;那么…

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下&#xff0c;由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕&#xff0c;人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而&#xff0c;面对层出不穷的AI模型&#xff0c;每个模型在完善度、功能性、易用性…

uni-app 微信小程序 电子签名及签名图片翻转显示功能

文章目录 1. 需求背景2. 开始撸2.1 点击 重写 进入签名页面&#xff08;上图一&#xff09;2.2 书写签名&#xff0c;点击确认返回&#xff0c;及图片翻转显示&#xff08;上图二&#xff0c;三&#xff09; 3. 图片进行翻转&#xff0c;返回翻转后的图片 1. 需求背景 接的一个…

Hdoop学习笔记(HDP)-Part.6 安装OracleJDK

六、安装OracleJDK 下载jdk安装文件&#xff0c;放到/opt中&#xff0c;将文件解压到/usr/local下后&#xff0c;修改/etc/profile文件中环境参数&#xff0c;实现java的安装。 创建jdk.yml文件 ---- hosts: alltasks:- name: copy and unzip jdkunarchive:src: "/opt/j…

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加两个平时经常用到的功能吧&#xff0c;就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划…

深入解析SpringBoot的请求响应机制

SpringBootWeb请求响应 前言1. 请求1.1 Postman介绍 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2. 响应2.1 Response…

电子学会C/C++编程等级考试2021年06月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字三角形问题 (图1) 图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注意:路径上的每一步只能从一个数走到下一层上和它…