代码随想录二刷(链表章节)

news/2024/9/22 21:26:59/文章来源:https://www.cnblogs.com/bathwind/p/18333216

代码随想录二刷(链表章节)

在这里插入图片描述
链表就是通过指针串联在一起的线性结构,每个节点都是由一个数据域和指针域(存放下一个节点的指针)。
双链表就是每个节点中既有指向前一个节点的,也有指向后一个节点的。
在这里插入图片描述
循环链表就是把头和尾连起来。
在这里插入图片描述
性能分析如下:
在这里插入图片描述
下面来看下链表的具体题目:

Leetcode203

在这里插入图片描述
这里首先要明白处理链表一个技巧就是可以创立一个哨兵节点。这样就能避免处理一些特殊情况,比如只有头的情况下。这样的话,链表始终是有一个元素的。具体来说过程如下图

在这里插入图片描述

# @lc code=start
# 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]:dummy = ListNode(next = head)cur = dummywhile cur.next:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummy.next  

Leetcode707

在这里插入图片描述

具体程序如下:

class Listnode:def __init__(self, val=0, next=None):self.val = valself.next = next
class MyLinkedList:def __init__(self):self.dummy = Listnode()self.size = 0def get(self, index: int) -> int:if index < 0 or index >= self.size:return -1cur = self.dummywhile cur.next:if index == 0:return cur.next.valcur = cur.nextindex -= 1def addAtHead(self, val: int) -> None:cur = self.dummycur.next = Listnode(val,cur.next)self.size += 1def addAtTail(self, val: int) -> None:cur = self.dummywhile cur.next:cur = cur.nextcur.next = Listnode(val)self.size += 1def addAtIndex(self, index: int, val: int) -> None:cur = self.dummyif index > self.size or index < 0:return for _ in range(index):cur = cur.nextcur.next = Listnode(val, cur.next)self.size += 1def deleteAtIndex(self, index: int) -> None:cur = self.dummyif index >= self.size or  index < 0:returnfor _ in range(index):cur = cur.nextcur.next = cur.next.nextself.size -= 1

首先分析get函数的实现:
在这里插入图片描述
由于题目要求下标是从0开始,所以要用个self.size记录下链表中元素的数量。那么插入头部和插入尾部以及删除指定Index,都会涉及到self.size的变化。
首先要把下标无效的情况给排除掉。也就是

if index < 0 or index >= self.size:return -1

接下里操作链表的话都是要用哨兵节点(这样就可以将只有一个元素的特殊情况也给合并了)。用for循环遍历就可以:

        cur = self.dummyfor _ in range(index):cur = cur.nextreturn cur.next.val


插入到第一个元素之前,也就是插入到头之前。这时候就体会到哨兵节点的好用了。

cur.next = Listnode(val,cur.next)

cur代表哨兵节点,哨兵节点的下一个也就是头部的位置,所以创建一个值为val,并且这个节点为原来节点的下一个节点。这样就完成插入的操作了
删除操作的话 ,
在这里插入图片描述

所以还要先判断下标是否超范围:

        if index >= self.size or  index < 0:return

然后接着for循环去根据index来。然后要删除的节点。

        for _ in range(index):cur = cur.next

所以删除:cur.next = cur.next.next
如果不明白的话。画个图就好理解下,做关于链表的题目。
在这里插入图片描述

在这里插入图片描述
插入操作的也可以画个图:
在这里插入图片描述

        cur = self.dummyif index > self.size or index < 0:return for _ in range(index):cur = cur.nextcur.next = Listnode(val, cur.next)

下面来看下反转链表的题目。
在这里插入图片描述
这里采用双指针的思想,pre为该节点要指向的新位置,cur为当前要处理的节点。并且当前要处理的节点的下个位置的信息由于你改变了指向会丢失,所以要用临时变量temp给保存起来。这些操作完成后,pre移动到cur,然后cur移动到下个位置也就是pre的位置。
所以程序思路其实知道了双指针后,并不是很难写出来:

class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:cur = headpre = Nonewhile cur:temp = cur.nextcur.next = prepre = curcur = tempreturn pre

Leetcode24

下面来看下下道题两两交换的链表题目:

在这里插入图片描述
这个交换链表的也建议是画图的话更好去理解。
在这里插入图片描述
看着这个图去写程序就可以。

class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:dummy_head = ListNode(next = head)cur = dummy_headpre = Nonewhile cur.next and cur.next.next:temp1 = cur.nexttemp2 = cur.next.next.nextcur.next = cur.next.nextcur.next.next = temp1cur.next.next.next = temp2cur = cur.next.nextreturn dummy_head.next

但是while循环要注意不止要判断Cur.next,还要判断cur.next.next。因为程序里面都是两两交换的。

Leetcode19

继续一道倒着删除链表的题目:
在这里插入图片描述

这道题思路是用双指针的思路,因为要删除倒数第n个节点。而链表的话只能按顺序遍历,所以用一个快指针,一个慢指针。快指针先走n步,然后在快指针的基础上慢指针移动,终止条件是快指针到达末尾。这样慢指针停的位置就是刚好要删除节点的前面一个。
具体原理如下:
在这里插入图片描述

class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:dummy_head = ListNode(0,head)slow,fast = dummy_head,dummy_headfor _ in range(n+1):fast = fast.nextwhile fast:slow = slow.nextfast = fast.nextslow.next=slow.next.nextreturn dummy_head.next  

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

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

相关文章

[Redis]哨兵

这次聊聊,Redis 的哨兵机制。为什么要有哨兵机制? 在 Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slave)进行数据同步了。这时如果要恢复服务的话,需要人工介入,选择一个…

一屏掌控物流风云:数据大屏开启高效运营时代

在日新月异的数字化浪潮中,物流行业正以前所未有的速度迈向智能化、高效化的新纪元。作为这一变革的核心驱动力之一,山海鲸可视化搭建的物流订单数据监控大屏以其强大的信息整合能力、实时的数据可视化展示以及精准的业务决策支持,成为了现代物流企业不可或缺的智慧中枢。想…

ofd轻阅读超大文件优化方案

本人使用Typescript开发了一款ofd 阅读器,参见文章《ofd轻阅读》。web端实现阅读功能有两种方案: ofd转svg;使用h5 canvas。 两种方案各有优劣,本人采用了canvas方案, 劣势:开发难点较大,需要处理更多的细节(比如:文字选中)。 优势:对细节掌控能力更强,能满足用户更…

笔记:从Aurora 8b/10b 到Aurora 64b/66b (一):Aurora 8b/10b

参考: https://www.xilinx.com/products/intellectual-property/aurora8b10b.html#documentation https://docs.amd.com/r/en-US/pg046-aurora-8b10b https://docs.amd.com/v/u/en-US/aurora_8b10b_ds797 https://mp.weixin.qq.com/s/gT4QUgvoFF6UI0PAhfEPvQ 补丁: Aurora 系…

矩阵指数的定义

人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。

虚树【学习笔记】

为什么要用虚树? 例题 在某些树上问题中,对于某次询问,我们并不需要用到全部的树上的点: 例如,例题中:总点数 \(n \le 2.5\times10^5\) 询问次数 \(m \le 5\times10^5\) 询问的点数 \(\sum k_i \le 5\times10^5\)我们可以发现其实每次询问均摊下来的询问点数k并不多,但如…

组合机床与自动化加工技术的网站开发

这两天一直在学习如何排版,开发一个网站,我运用了前几天所学的vue基本语法将网站的大致模样copy下来这期间我查找了不少知识 比如照片如何在网页中不变性的缩放,通过研究我运用class固定结构和class="container"属性将组件固定形成此网页

火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效

本文将介绍字节跳动基于Parquet格式降本增效的技术原理和在具体业务中的实践,首先介绍了Parquet格式在字节跳动的应用,然后将结合具体的应用场景:小文件合并和列级TTL ,从问题产生的背景和解决问题的技术方案出发,介绍如何基于Parquet格式实现降本增效的目标。更多技术交流…

图片预加载和懒加载

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣图片预加载和图片懒加载是网页优化的两种常见技术,它们可以提升用户体验并改善网页性能。 图片预加载(Image Preloading): 图片预加载是指在页面加载时提前加载图片,使其缓存在浏览器中,当用户需要查看这些图片时,…

P4062 Yazid 的新生舞会

谨以此文纪念一场灾难 来给这位善良的人的人点点赞首先 题面中所指的众数为 绝对众数(绝对众数是指在一组数据中出现次数 \(超过\) 总数一半的数值。), 下文的所有众数也指绝对众数。 有以下性质任意一个区间的绝对众数的数值唯一如果\(x\)是区间\([l,r]\)的众数,那么对于\…

KubeSphere 部署向量数据库 Milvus 实战指南

作者:运维有术星主Milvus 是一个为通用人工智能(GenAI)应用而构建的开源向量数据库。它以卓越的性能和灵活性,提供了一个强大的平台,用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索,并以最小的性能损失扩展到数百亿向量。其分布式架构确保了系统的高可用…

利用DYNAMIXEL智能伺服舵机从《传送门2》中打造一个更优质的动画机器人小麦克利(Wheatley)

原文链接:https://www.youtube.com/watch?v=OEn9hZ-Tw1E这段视频由ROBOTIS提供! 大家好,我想给大家推荐一个精彩视频,在视频中展示了如何制作《传送门2》中的动画机器人小麦克利(Wheatley)。看看是如何利用DYNAMIXEL智能伺服系统让小麦克利活起来的。对于那些可能想设计…