代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

目录

  • 链表理论基础
  • 203. 移除链表元素
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析
  • 707. 设计链表
    • 1、题目描述
    • 2、思路
    • 3、code
  • 206. 反转链表
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析

链表理论基础

❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1),适合动态增删;查询时间复杂度 O ( N ) O(N) O(N)不适合查询
🧡链表在内存中离散分布

做题的方法总结:

1️⃣ 虚拟头结点:链表的结构就决定了要想操作某一节点就要知道前面的一个节点,但是头结点是没有前一个节点的,如果不想特殊化处理头节点,可以引入一个虚拟头节点,目的是让头节点也变成一般节点
2️⃣创建的cur指针指向要被操作的节点的前一个节点
3️⃣插入新节点时:要先连接后一个节点,再断开前一个节点
4️⃣改变某一个节点的指向时:要先使用temp指针保存该节点的下一节点,否则会造成后续节点丢失

203. 移除链表元素

题目链接:link

1、题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点
在这里插入图片描述

2、思路

链表移除某一个节点只需要将上一个节点的next指针指向下一个节点就行了
在这里插入图片描述

但是如果要移除头节点,头结点可是没有上一个节点的,所以要把头节点直接指向头节点的下一节点。
在这里插入图片描述

所以就要把所有节点分成两种情况:是头节点不是头结点

但是也可以用一种情况来实现删除操作:加入虚拟头结点 ,这样头结点也变成了一般节点。

3、code

class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:# 使用虚拟头结点dummyhead = ListNode(-1) # 首先初始化虚拟头结点dummyhead.next = head # 让虚拟头结点的next指针指向头节点,这样就把头节点的处理变成了一般节点的处理cur = dummyhead # 令cur表示要删除的节点的前一个节点while cur.next != None:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummyhead.next 

❤️使用dummyhead保持在链表的最开始不动,cur来移动删除节点,最后返回dummyhead.next
💜 为啥不使用head?因为haed的值可能等于val,也会被删除

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( 1 ) O(1) O(1)

707. 设计链表

题目链接:link

1、题目描述

实现 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 的节点。

2、思路

1️⃣ 插入节点:先连接后面的节点,再连接前面的节点
2️⃣删除节点:指针要指向被删除节点的前一个节点

3、code

class LinkNode:def __init__(self,val,next):self.val = valself.next = Noneclass MyLinkedList:def __init__(self):self.dummyhead = LinkNode(-1,None)self.size = 0# def print(self):#     cur = self.dummyhead#     for i in range(self.size):#         print(cur.next.val)#         cur = cur.nextdef get(self, index: int) -> int:if index >= self.size:return -1# 如果链表是1,2,3,返回index = 1,就是2cur = self.dummyhead.nextfor i in range(0,index):cur = cur.nextreturn cur.valdef addAtHead(self, val: int) -> None:new_node = LinkNode(val,None)new_node.next = self.dummyhead.nextself.dummyhead.next = new_nodeself.size += 1returndef addAtTail(self, val: int) -> None:self.addAtIndex(self.size,val)returndef addAtIndex(self, index: int, val: int) -> None:if index > self.size:return# 原来是1,3,加入index = 1cur = self.dummyheadfor i in range(index):cur = cur.nextnew_node = LinkNode(val,None)new_node.next = cur.nextcur.next = new_nodeself.size += 1returndef deleteAtIndex(self, index: int) -> None:if index >= self.size:return# 链表是1,2,3,删除index = 1,链表变成1,3cur = self.dummyheadfor i in range(index):cur = cur.nextcur.next = cur.next.nextself.size -= 1return# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)

206. 反转链表

题目链接:link

1、题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

2、思路

双指针
在这里插入图片描述

3、code

class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:# 双指针方法# 首先初始化双指针cur = head # 先保存头结点pre = None # 因为头节点的反转下一个节点就是空节点 # 之后就是一节一节的反转链表,直到cur指向Nullwhile cur != None:temp = cur.next # 如果反转链表的next指向的话,会使得正向的指针消失,所以要先保存一下    cur.next = pre # 反转pre = cur # 要先后移precur = temp # 后移动curreturn pre

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( 1 ) O(1) O(1)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻!!! 整数在内存中的存储 回忆知识:在讲操作符的那章节中,对于整数而言咱们讲过原码,反码和补码。整数分为有…

【初阶数据结构】一文讲清楚 “堆” 和 “堆排序” -- 树和二叉树(二)(内含TOP-K问题)

文章目录 前言1. 堆1.1 堆的概念1.2 堆的分类 2. 堆的实现2.1 堆的结构体设置2.2 堆的初始化2.3 堆的销毁2.4 添加数据到堆2.4.1 "向上调整"算法 2.5 从堆中删除数据2.5.1 “向下调整”算法 2.6 堆的其它各种方法接口函数 3. 堆排序3.1 堆排序的代码实现 4. TOP-K问题…

CWFED:自然灾害检测数据集(猫脸码客 第192期)

Cyclone Wildfire Flood Earthquake Database 在自然灾害频发的今天,准确、及时地获取并分析相关数据对于灾害预防、预警及响应至关重要。为此,Cyclone Wildfire Flood Earthquake Database(以下简称CWFE Database)应运而生&…

PostgreSQL 的log_hostname 参数测试

PostgreSQL 的log_hostname 参数测试 log_hostname 是 PostgreSQL 配置文件 (postgresql.conf) 中的一个参数,用于控制是否在日志条目中记录客户端主机名。默认情况下,PostgreSQL 只记录客户端的IP地址,而 log_hostname 参数允许数据库管理员…

使用FLBOOK快速制作3D电子版翻页产品册

​随着数字化时代的到来,传统纸质产品册已逐渐无法满足人们快节奏、便捷的生活方式。而FLBOOK,一款强大的3D电子版翻页产品册制作工具,凭借其简洁的操作界面、丰富的功能和出色的展示效果,已成为越来越多企业的首选。 1.要制作电子…

1:java的介绍与基础1:变量,数据类型与数学运算符

1.1Java的开始 从今天开始,我将更新一下关于学习Java的笔记,文章,希望大家支持。这个Java吧,感觉本质上逻辑始于python很类似,但是吧它的表达更加繁琐难懂,所以我还是喜欢python,比较简介明了。…

获取java jdk包的方式记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、OpenLogic方式二、华为源下载 前言 记录一下获取java jdk的方式方法。 一、OpenLogic方式 网址:https://www.openlogic.com/openjdk-download…

OCR两篇革命之作

DocOwl2 参考 阿里8B模型拿下多页文档理解新SOTA,324个视觉token表示一页,缩减80% mPLUG-DocOwl 2聚焦多页文档理解,兼顾效果和效率,在大幅缩减单页视觉token的前提下实现了多页文档理解的SOTA效果。 仅用324个token表示文档图…

相亲交易系统源码详解与开发指南

随着互联网技术的发展,越来越多的传统行业开始寻求线上转型,其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求,因此,开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

API接口在不同编程语言中是如何实现的?

API接口是现代软件开发中的关键技术,它允许不同的软件系统相互通信和交换数据。在不同的编程语言中,API接口的实现方式可能会有所不同,但它们的核心概念是一致的:提供一组预定义的方法和协议,使得开发者可以访问特定的…

SpringCloud~

帮你轻松入门SpringCloud~ 1 微服务概述 1.1什么是微服务 如idea中使用maven建立的一个个moudle,它具体是使用SpringBoot开发的一个小模块,专业的事交给专业的模块来做,每个模块完成一个具体的任务或功能。 1.2 什么是微服务架构 它将单一应用…

SAP B1 流程实操 - 营销单据销售部分(上)

背景 在 SAP B1 中,最重要的模块就是【销售】,企业可能不涉及生产和库存(贸易公司),甚至不涉及采购(服务业),但是一定会有基本的 销售。本文中我们讲解 销售 模块的基本核心&#x…

持续低迷的大环境下,写给技术人几句掏心窝的话

文章目录 一、写在前面二、职业发展:兴趣是关键点三、关于职业规划四、做事认真,提升效率五、不要怕事,多经历总是好的六、走技术还是走管理七、关于跳槽八、认识个人与团队的关系,并且学会自我管理九、做好知识归档、写好文档十、…

ORA-28032 Your password has expired and the database is set to read only

做个记录。 non-cdb 处于只读状态,CDB创建到noncdb的dblink后产生的报错,dblink可以成功创建,但无法连接到non-cdb。 解决:一开始以为是cdb的密码不正确,mos上找到问题,non-cdb的密码过期了,并且…

卷积神经网络(Convolutional Neural Network,CNN)

CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层类似神经网络的部分,用来输出想要的结果。 卷积思想 卷积Convolution&#x…

对人像图添加指定光源,再进行二次扩图

在一些业务场景中,需要对人像图片添加特定光源,来增加氛围感,例如赛博朋克科技、海边夕阳余晖、以及红蓝相间的高冷;但实现这个功能的难点是:如何将光源与原图片融合,在图片上产生正常光的镜面反射&#xf…

【已解决】Chrome浏览器被2024年新版流氓软件劫持,总会自动打开hao.360.com和so.com主页

最近我家里电脑的 Chrome 浏览器每次启动时都会自动打开 hao.360.com (有时是 www.so.com)主页。此时在浏览器地址栏手动输入 chrome://version ,可见命令行被强制加上一个 360 链接: 我在网上找解决方法,看到大部分都…

File异常(获取并遍历)

1.当调用者File表示的路径不存在时,返回null 2.当调用者File表示的路径是文件时,返回null 3.当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组 4.当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和…

信息学奥赛初赛天天练-92-CSP-S2023阅读程序2-动态数组、反转函数、埃氏筛法、欧拉筛法、唯一分解定理、约数、约数个数、约数和

2023 CSP-S 阅读程序2 判断题正确填 √&#xff0c;错误填 ⨉ &#xff1b;除特殊说明外&#xff0c;判断题 1.5 分&#xff0c;选择题 3 分&#xff0c;共计 40 分&#xff09; 01 #include <iostream> 02 #include <cmath> 03 #include <vector> 04 #inc…

AI基础 L27 Introduction to Automated Planning - III

Complexity Analysis • Complexity analyses are done on decision problems or language-recognition problems — Problems that have yes-or-no answers • A language is a set L of strings over some alphabet A — Recognition procedure for L ◦ A procedure R(x) th…