203.移除链表元素 707.设计链表 206.反转链表

 203.移除链表元素

Python链表节点定义:
class ListNode:def __init__(self, val, next=None):self.val = valself.next = next
性能分析

链表的特性和数组的特性进行一个对比,如图所示:

203. 移除链表元素

这道题就是给大家一个链表,移除链表中等于某个target的所有节点。然后返回这个链表的头节点。

如果我们删除这个节点的话,让这个节点的前一个节点,指向这个节点的下一个节点。这样我们就把这个元素从列表中移除了。

移除节点时有一个问题。如果移除的节点是头节点,头节点没有前一个节点,我们要把Head向下移1位  head=head.next。这样我们就把头结点,从链表中删除了。他的新的头结点是原来的第二个节点。

从列表中移除元素针对头节点和非头节点的移除元素的方式是不一样的。
那么我们在实现这段代码逻辑的时候就要做一个判断,我们删除的这个节点是不是头节点?这样的话我们删除节点的方式就没有统一,能不能有一种方式能统一的方式删除所有节点?
还有一种方法叫做虚拟头结点的方法:就是在这个列表中再加入一个头节点。这个头节点叫做dummy head。是虚拟的。这样的话我们再去删除列表中的元素时,所有的元素都可以按照一个规则进行删除。

不用虚拟头节点来删除代码中元素的方法:

首先我们要判断我们删除的元素是不是头节点。
这个头节点一定要不为空,因为我们接下来要取这个头节点的值。如果这个头节点为空的话,我们相当于取了一个空指针,编译的时候会报错。同时这个头节点的数值等于我们要删除的值。满足这样的情况时,我们要把这个头节点删掉。
if (head != null and head->val == target)
我们进行移除头节点的操作后,移动到下一个节点时发现还是一样。所以我们移除头节点其实是一个持续移除的过程。所以这里应该是while。
while (head != null and head->val == target)head = head->nextcur  = head
这里的临时指针为什么是从head开始而不是从它的下一个节点开始?例如说我现在要删除第二个元素。删除第二个元素要找他的上一个节点指向他的下一个节点。所以这里要记录该节点的上一个节点。所以我们要删除head.next要从head开始。
whlie(cur != null && cur.next != null){
这两个值不能为空,否则在取值时会出现空指针错误。if (cur->next->val == target){cur->next = cur->next->next}else {cur = cur->next}return head

用虚拟头节点的方法:

首先将dummyhead的实例化,new出来一个节点
dummyhead = new ListNode()
dummyhead->next = head
定义一个临时指针来遍历链表,头节点的指针是不能改的。否则最后返回的头节点一直在变化。
cur = dummyhead 
这里为什么不定义cur = dummyhead.next?我们如果要删掉一个元素,必须要知道这个元素的上一个元素是什么。
while(cur->next != null){if (cur->next->val == target){cur->next = cur->next->next;else{cur = cur->next}
return dummyhead->next
为什么不返回head?因为head有可能已经被我们删掉了。

Python代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:dummyhead = ListNode()dummyhead.next = headcur = dummyheadwhile cur.next != None:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummyhead.next

707. 设计链表

 

Python代码:

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass MyLinkedList:def __init__(self):self.dummy_head = ListNode()self.size = 0def get(self, index: int) -> int:if index < 0 or index >= self.size:return -1current = self.dummy_head.nextfor i in range(index):current = current.nextreturn current.valdef addAtHead(self, val: int) -> None:self.dummy_head.next = ListNode(val, self.dummy_head.next)self.size += 1def addAtTail(self, val: int) -> None:current = self.dummy_headwhile current.next:current = current.nextcurrent.next = ListNode(val)self.size += 1def addAtIndex(self, index: int, val: int) -> None:if index < 0 or index > self.size:returncurrent = self.dummy_headfor i in range(index):current = current.nextcurrent.next = ListNode(val, current.next)self.size += 1def deleteAtIndex(self, index: int) -> None:if index < 0 or index >= self.size:returncurrent = self.dummy_headfor i in range(index):current = current.nextcurrent.next = current.next.nextself.size -= 1# 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. 反转链表

Python代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre =Nonecur = headwhile cur:temp = cur.nextcur.next = prepre = curcur = tempreturn pre方法二:
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverse(self, cur: Optional[ListNode], pre: Optional[ListNode]) ->Optional[ListNode]:if cur == None:return pretemp = cur.nextcur.next = prereturn self.reverse(temp, cur)def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:return self.reverse(head, None)

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

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

相关文章

人工智能之数学基础:利用全概率公式如何将复杂事件转为简单事件

本文重点 全概率公式是概率论中的核心工具,用于计算复杂事件的概率。其核心思想是将复杂事件分解为若干互斥且穷尽的简单事件,通过计算各简单事件的概率及其条件概率,最终求得目标事件的概率。 全概率公式 全概率公式就是将复杂事件简单化,定义如下: 如果随机事件A1,…

飞算JavaAI深度解析:从入门到对比

目录 一、飞算JavaAI是什么 二、如何注册和开始使用 三、使用体验&#xff1a;它能带来什么 四、与其他大模型的对比分析 五、总结与展望 随着人工智能技术的飞速发展&#xff0c;大模型在软件开发领域的应用越来越广泛。其中&#xff0c;代码生成工具作为提升开发效率的利…

Flutter各大主流状态管理框架技术选型分析及具体使用步骤

技术选型决策树 #mermaid-svg-m5gUL7Cpx4rYV2BQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-icon{fill:#552222;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-text{fill:#552222;stroke:#552…

Redis类型之String

1.Redis中的string注意本文以及之后讲的redis的类型但是指的value的类型&#xff0c;所有的key都是stringRedis中的字符串&#xff0c;直接就是按照二进制数据的方式存储的&#xff0c;不会做任何的编码转换&#xff0c;这里相对于mysql就比较好&#xff08;个人感觉&#xff0…

[激光原理与应用-156]:光学器件 - 激光器为什么会出现多余的能量,哪些地方会出现多余能量?

在激光器运行过程中&#xff0c;多余能量的出现是不可避免的物理现象&#xff0c;其根源在于能量转换与传输过程中的非理想特性。以下从能量来源、产生位置及具体机制三方面进行详细说明&#xff1a;一、多余能量的主要来源泵浦源效率限制泵浦源&#xff08;如激光二极管、闪光…

Arxiv-Daily

Daily Paper Report - 2025-07-24 12:53 Today’s Recommended Papers 1. Multi-modal Multi-task Pre-training for Improved Point Cloud Understanding Authors: Liwen Liu, Weidong Yang, Lipeng Ma, Ben Fei Deep-Dive Summary: 多模态多任务预训练以改善点云理解 预…

如何对云环境或者超融合系统进行性能测试?

最近几个月&#xff0c;公司开启了新的产品计划&#xff0c;准备来做一个国产超融合一体机&#xff08;其实个人觉得现在入行已经晚了太多了&#xff0c;市场基本没有多少了&#xff09; POC功能测试过完&#xff0c;但是感觉不到什么优势&#xff0c;由于芯片架构采用的是arm架…

【web自动化测试】实战

web自动化测试就是对界面的测试1、编写测试用例2、参考测试用例&#xff0c;创建自动化测试项目&#xff0c;编写自动化测试脚本论坛登录页&#xff1a;ForumLoginTest.py论坛首页&#xff1a;ForumListTest.py论坛详情页&#xff1a;ForumDetailTest.py论坛编辑页&#xff1a;…

在Maxscript中随机化对象变换、颜色和材质

只需几行Maxscript,即可为3ds Max场景带来更多活力和变化! 在本文中,您将学习如何快速随机化选定对象的位置、旋转、线颜色和材质。 非常适合在ArchViz、动态图形和产品可视化项目中创建更自然、更少机械的布局。 为什么要使用随机化脚本? 1.快速为场景添加自然随机性 2.…

分类数据集 - 交通事故场景分类数据集下载

数据集介绍&#xff1a;交通事故场景分类数据集&#xff0c;真实交通场景高质量图片数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下是否发生交通事故检测项目&#xff0c;以及作为监控场景通用交通检测数据集场景数据的补充&#xff1b;数据集类别&#xff1…

内网公网详解,及无公网IP内网穿透给外网直接远程连接访问的具体实现方法步骤

一、什么是内网、外网1、内网IP&#xff08;局域网IP&#xff09;是指在私有网络或局域网内部使用的IP地址&#xff0c;无法直接从互联网访问&#xff0c;需通过NAT&#xff08;网络地址转换&#xff09;技术实现对外通信。内网IP&#xff08;Intranet IP&#xff09;是专为局域…

Redis协议数据迁移方式

主从复制&#xff08;REPLICAOF/SLAVEOF&#xff09;&#xff1a;目标实例挂为从节点&#xff0c;通过复制协议全量增量同步后切换为主。模拟从节点工具&#xff1a;模拟复制协议同步数据&#xff0c;常见两种实现&#xff1a;(1) 拉取全量和增量命令流&#xff0c;在本地生成 …

英语中日期与时间缩写

日常使用中&#xff0c;时间缩写无处不在。掌握这些缩写不仅能提高沟通效率&#xff0c;还能让您的英语表达更加地道和专业。本文将系统性地介绍英语中各类时间相关缩写&#xff0c;包括月份、星期、时刻表达等&#xff0c;并提供实用记忆技巧和应用场景。 一、时间缩写基础概…

【Spring Cloud】-- RestTeplate实现远程调用

实现远程调用有很多种方式&#xff0c;这里我们使用RestTemplate来进行实现。 REST &#xff1a;表现层资源状态转移&#xff08;资源在网络中以某种表现形式进行状态转移&#xff09;&#xff0c;是一种软件架构风格&#xff0c;状态转移&#xff1a;数据状态的变化。 表现层&…

2025年信创政策解读:如何应对国产化替代挑战?(附禅道/飞书多维表格/华为云DevCloud实战指南)

本文核心产品&#xff1a;​​禅道&#xff08;国产项目管理工具&#xff09;、飞书多维表格&#xff08;协同办公工具&#xff09;、华为云DevCloud&#xff08;云端研发平台&#xff09;​​ ——在“自主可控”成为国家战略关键词的2025年&#xff0c;国产化替代已从“可选动…

如何让 RAG 检索更高效?——大模型召回策略全解

如何让 RAG 检索更高效&#xff1f;——大模型召回策略全解 一、引子&#xff1a;RAG 的“强”靠得住吗&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;作为一种将文档检索与大语言模型结合的框架&#xff0c;已成为企业落地知识问答、搜索增强、智能…

Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代码来源 https://github.com/ZhengPeng7/BiRefNet 模块作用 DIS 是一种旨在对高分辨率图像中的目标物体进行精确分割的技术&#xff0c;尤其适用于具有复杂细微结构的物体&#xff0c;例如细长的边缘或微小细节。传统方法在处理这类任务时往往难以捕捉细微特征或恢复高分辨…

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research&#xff1a;Agent 时代的核心能力2025 年被称为 Agent 落地元年&#xff0c;在解锁的各类场景中&#xff0c;最有代表性之一&#xff0c;就是 Deep Research 或者以它为基座的各类应用。为什么这么讲&#xff1f; 因为通过 Agentic RAG 及其配套的反思机制&#…

CMakeLists.txt学习

一&#xff1a;#是行注释 &#xff0c;[[ 块注释 ]]0.cmake_minimum_required: 指定使用的cmake的最低版本1.project() 定义工程名称并可以指定工程的版本&#xff0c;工程描述&#xff0c;web主页地址&#xff0c;支持的语言&#xff08;默认情况支持所有语言&#xff09;2.…

Pytorch-04 搭建神经网络架构工作流

搭建神经网络架构 在pytorch中&#xff0c;神经网络被抽象成由一系列对数据执行特定操作的层或者模块组成&#xff0c;比如下面的Attention实现&#xff0c;每个块都是一个模块或者层。 如果你想快速搭建网络架构&#xff0c;torch.nn这个命名空间提供了所有很多开箱即用的层…