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

news2024/11/13 9:41:28

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

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

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 = dummy
        while cur.next:
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummy.next  

Leetcode707

在这里插入图片描述

具体程序如下:

class Listnode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class MyLinkedList:

    def __init__(self):
        self.dummy = Listnode()
        self.size = 0
    def get(self, index: int) -> int:
        if index < 0 or index >= self.size:
            return -1
        cur = self.dummy
        while cur.next:
            if index == 0:
                return cur.next.val
            cur = cur.next
            index -= 1
    def addAtHead(self, val: int) -> None:
        cur = self.dummy
        cur.next = Listnode(val,cur.next)
        self.size += 1
    def addAtTail(self, val: int) -> None:
        cur = self.dummy
        while cur.next:
            cur = cur.next
        cur.next = Listnode(val)
        self.size += 1
    def addAtIndex(self, index: int, val: int) -> None:
        cur = self.dummy
        if index > self.size or index < 0:
            return 
        for _ in range(index):
            cur = cur.next
        cur.next = Listnode(val, cur.next)
        self.size += 1
    def deleteAtIndex(self, index: int) -> None:
        cur = self.dummy
        if index >= self.size or  index < 0:
            return
        for _ in range(index):
            cur = cur.next
        cur.next = cur.next.next
        self.size -= 1

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

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

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

        cur = self.dummy
        for _ in range(index):
            cur = cur.next
        return 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.dummy
        if index > self.size or index < 0:
            return 
        for _ in range(index):
            cur = cur.next
        cur.next = Listnode(val, cur.next)

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

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        cur = head
        pre = None
        while cur:
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
        return pre

Leetcode24

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

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

class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy_head = ListNode(next = head)
        cur = dummy_head
        pre = None
        while cur.next and cur.next.next:
            temp1 = cur.next
            temp2 = cur.next.next.next
            cur.next = cur.next.next
            cur.next.next = temp1
            cur.next.next.next = temp2
            cur = cur.next.next
        return 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_head
        for _ in range(n+1):
            fast = fast.next
        while fast:
            slow = slow.next
            fast = fast.next
        slow.next=slow.next.next
        return dummy_head.next  

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

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

相关文章

Java面试八股之@Autowired 和 @Resource的区别

Autowired 和 Resource的区别 在Spring框架中&#xff0c;Autowired 和 Resource 是两个常用的依赖注入注解&#xff0c;但它们有一些关键的区别。下面是这两个注解的主要差异&#xff1a; 1. 注解来源 Autowired&#xff1a; 是Spring框架提供的注解&#xff0c;位于包 or…

TerraSAR-XTanDEM-X卫星详解(一)

全球SAR卫星大盘点与回波数据处理专栏目录 1. TerraSAR-X简介 TerraSAR-X(Terra Synthetic Aperture Radar-X)和TanDEM-X(TerraSAR-X add-on for Digital Elevation Measurement)是由德国宇航中心(DLR)和EADS Astrium公司共同推出的一对双子卫星。Terra源自拉丁语,是地…

解决win10蓝屏“选择一个选项”的问题!

今天台式机开机&#xff0c;出现蓝屏问题&#xff0c;记录一下。 一、问题 启动修复不行&#xff0c;系统还原没还原点&#xff0c;系统映像恢复没有文件。难道要重装系统&#xff1f;手上只能Win7和XP的启动盘。此路不通。 二、解决 使用命令提示符。输入&#xff1a; bcdb…

《花100块做个摸鱼小网站! · 序》灵感来源

序 大家好呀&#xff0c;我是summo&#xff0c;这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛&#xff0c;2核2G的云服务器一年只要99块钱&#xff0c;懂行的人应该知道这个价格在业界已经是非常良心了&#xff0c;虽然优惠只有一年&a…

PMP考试难吗?好不好学?

PMP 并不难&#xff0c;虽然新考纲大家都说开盲盒&#xff0c;做阅读理解&#xff0c;但线上考试成绩出的快&#xff0c;晒 3A 的也不少。给大家分享下我的备考经历&#xff0c;希望能给后面备考的同学一点参考吧。 现在的新考纲是要学习三本书的&#xff0c;《PMBOK》第六版、…

弘景光电:技术实力与创新驱动并进

在光学镜头及摄像模组产品领域&#xff0c;广东弘景光电科技股份有限公司&#xff08;以下简称“弘景光电”&#xff09;无疑是一颗耀眼的明星。自成立以来&#xff0c;弘景光电凭借其强大的研发实力、卓越的产品性能、精密的制造工艺以及严格的质量管理体系&#xff0c;在光学…

使用 useSeoMeta 进行 SEO 配置

title: 使用 useSeoMeta 进行 SEO 配置 date: 2024/7/30 updated: 2024/7/30 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt3中的useSeoMeta组合函数&#xff0c;用于简化和优化网站的SEO配置。通过这个工具&#xff0c;开发者可以在Nuxt3项目中方便地设置页面…

C++ - 负载均衡式在线OJ

目录 一.项目的宏观结构 1.1 只实现类似 leetcode 的题⽬列表在线编程功能 1.2 项⽬宏观结构 1.3编写思路 二.所⽤技术与开发环境 2.1 所用技术 2.2 开发环境 三.compiler 服务设计 3.1 编译功能 3.2 日志功能 3.3 运⾏功能 3.4 编译并运⾏功能 3.5 把编译并运⾏功…

OpenBayes 教程上新 | 文生图、图生图、图像修复三合一神器, HiDiffusion 一键启动教程现已上线!

扩散模型已成为高分辨率图像合成的主流方法&#xff0c;传统的扩散模型虽然在图像合成方面取得了显著进展&#xff0c;但在扩展到更高分辨率时往往面临对象重复和计算成本增加的问题。 旷世科技开源的高分辨率框架 HiDiffusion&#xff0c;由分辨率感知 U-Net (RAU-Net) 和改进…

【手撕数据结构】链表高频面试题

目录 移除链表元素反转链表链表的中间节点倒数第k个节点反转链表(初阶)快慢指针法(进阶) 合并两个有序链表链表分割链表的回文结构 移除链表元素 思路:由题目可知我们需要在给定的一个链表中移除值为val的节点&#xff0c;这里需要注意的情况就是全是val的链表移除后为空链表和…

收藏!2024年GPU算力最新排名

​GPU&#xff08;图形处理单元&#xff09;算力的提升是驱动当代科技革命的核心力量之一&#xff0c;尤其在人工智能、深度学习、科学计算和超级计算机领域展现出了前所未有的影响力。2024年的GPU技术发展&#xff0c;不仅体现在游戏和图形处理的传统优势上&#xff0c;更在跨…

吴恩达老师机器学习-ex2

有借鉴网上的部分 第一题 导入库&#xff0c;读取数据并且展示前五行&#xff08;基本操作&#xff09; import numpy as np import pandas as pd import matplotlib.pyplot as plt #读取数据 path "./ex2data1.txt" data pd.read_csv(path,headerNone,names[&q…

Netty技术全解析:PooledByteBufAllocator源码视角下的详解

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

MySQL---JDBC

一、JDBC是什么&#xff1f; JDBC(Java Database Connectivity):是Java访问数据库的解决方案。 JDBC定义了一套标准的接口&#xff0c;即访问数据库的通用API&#xff0c;不同数据库的厂商根据各自数据库的特点实现这些接口。 JDBC希望用相同的方式访问不同的数据库&#xff0c…

spring:xml定义bean

spring有两种方法定义bean&#xff0c;一种是使用xml标签&#xff0c;一种是注解。在这里介绍使用xml标签定义bean。 我的文件目录如上图所示&#xff0c;在这里创建了bean.xml文件&#xff0c;bean.xml文件中定义了bean。 文件内容&#xff1a; <?xml version"1.0&…

Java线程池动态内存队列思路

背景 在我们定义线程池时候&#xff0c;需要创建一个对列用来存储未执行而排队的任务&#xff0c;这个队列长度问题一直都是需要开发人员斟酌考虑点。在阿里巴巴开发手册中有怎么一个规则如&#xff1a; 说明: Executors返回的线程池对象的弊端如下 FixedThreadPool和SingleT…

【前端面试】七、算法-递归

遍历方法总结 链式调用 数组的很多操作可以构成链式操作&#xff0c;类似这样的格式&#xff1a;…map().filter(…).sort(…).map(….)链式操作就是对象方法返回类型是自身的。比如map是属于数组的方法&#xff0c;它返回数组&#xff0c;所以构成了链式操作优势&#xff1a;…

【iOS】——持久化

在iOS开发中&#xff0c;数据持久化是非常重要的&#xff0c;因为它允许应用程序在不同会话之间保存用户数据、设置、偏好等信息。 为什么数据持久化 数据保存&#xff1a; 目的&#xff1a;将应用程序中的数据保存到非易失性存储中&#xff0c;以便在应用程序关闭或重启后仍…

眼镜清洗机哪个品牌好?性价比高的超声波眼镜清洗机

清洁眼镜、化妆刷、项链等物品其实是挺麻烦的&#xff0c;尤其是化妆刷这种经常使用的物品&#xff0c;需要用专门的清洁剂并保持一定的清洗频率。眼镜的日常清洁主要是用眼镜布擦拭镜片上的灰尘和指纹&#xff0c;但对于顽固的污渍或油脂&#xff0c;只有超声波清洗机能提供快…

六西格玛管理法

六西格玛管理法是一种旨在提高业务流程效率和减少缺陷的管理策略。它最初由摩托罗拉公司在1980年代末期提出&#xff0c;并随后被通用电气等公司广泛应用和发展。六西格玛的核心理念是通过减少过程变异性来提高产品质量和服务水平。 六西格玛的含义&#xff1a; 统计学概念&am…