力扣刷题-链表-设计链表

news2024/11/18 19:52:10

题意:
在链表类中实现这些功能:
get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
这是一道练习链表基础比较好的题目。

# 定义链表
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class MyLinkedList(object):

    def __init__(self): # 下方可以直接赋值 里面不用参数也可
        self.dummy_node = ListNode()
        self.size = 0 # 注意定义一个 size


    def get(self, index):
        """
        :type index: int
        :rtype: int
        """
        if index < 0 or index >= self.size:
            return -1
        current = self.dummy_node.next
        for i in range(index):
            current = current.next
            
        return current.val

    def addAtHead(self, val):
        """
        :type val: int
        :rtype: None
        """
        temp = ListNode()
        temp.val = val
        temp.next = self.dummy_node.next
        self.dummy_node.next = temp
        self.size += 1 # 注意 size+1

    def addAtTail(self, val):
        """
        :type val: int
        :rtype: None
        """
        temp = ListNode()
        temp.val = val
        current = self.dummy_node
        for i in range(self.size):
            current = current.next
        current.next = temp
        # temp.next = None 因为节点定义里面已经有了
        self.size += 1

    def addAtIndex(self, index, val):
        """
        :type index: int
        :type val: int
        :rtype: None
        """
        if index < 0 or index > self.size: # 注意这里没有等于 因为下面是range(index)也不会取到
            return
        temp = ListNode()
        temp.val = val
        current = self.dummy_node
        for i in range(index):
            current = current.next
        temp.next = current.next
        current.next = temp
        self.size += 1 # 注意加1


    def deleteAtIndex(self, index):
        """
        :type index: int
        :rtype: None
        """
        if index < 0 or index >= self.size:
            return
        current = self.dummy_node
        for i in range(index):
            current = current.next # 先到达位置
        current.next = current.next.next # 再执行删除
        self.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)

难点或者容易出错的地方在于:一些边界的处理 以及 代码健壮性处理 的地方 :
image.png
image.png

# 双链表
class ListNode(object):
    def __init__(self, val=0, pred=None, next=None):
        self.val = val
        self.pred = pred
        self.next = next

class MyLinkedList(object):
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0
    
    def get(self, index):
        if index < 0 or index >= self.size:
            return -1

        if index < self.size // 2: # index在前面一半 就用头节点来遍历 
            current = self.head
            for i in range(index):
                current = current.next
        else:
            current = self.tail
            # x = 0
            # while x < self.size - index - 1:
            #     current = current.pred
            #     x += 1
            for i in range(self.size - index - 1):
                current = current.pred

        return current.val
    
    def addAtHead(self, val):
        temp = ListNode(val=val, next=self.head) # 记得用self
        if self.head:
            self.head.pred = temp
        else: # 需要判断是否存在头节点
            self.tail = temp # 不存在 那么新节点赋给头尾节点
        self.head = temp
        self.size += 1
        
    
    def addAtTail(self, val):
        temp = ListNode(val=val, pred=self.tail)
        if self.tail: # 需要判断尾节点是否存在
            self.tail.next = temp
        else:
            self.tail = temp
        self.head = temp
        self.size += 1
    
    def addAtIndex(self, index, val):
        if index < 0 or index > self.size:
            return
        
        if index == 0:
            self.addAtHead(val)
        elif index == self.size:
            self.addAtTail(val)
        else:
            if index < self.size // 2: # 在前面一半
                current = head
                for i in range(index-1):
                    current = current.next
            else:
                current = self.tail
                x = 0
                while x < self.size - index:
                    current = current.pred
                    x += 1
                temp = ListNode(val=val)
                current.next.pred = temp
                current.next = temp
                self.size += 1

    
    def deleteAtIndex(self, index):
        if index < 0 or index >= self.size:
            return
        
        if index == 0:
            self.head = self.head.next # 下一个节点是头节点
            if self.head: # 还需要判断是否存在
                self.head.pred = None
            else:
                self.tail = None # 不存在完全就是空的
        
        elif index == self.size - 1: # !!! 很多细节
            self.tail = self.tail.prev
            if self.tail:
                self.tail.next = None
            else:
                self.head = None
        else:
            if index < self.size // 2:
                current = self.head
                for i in range(index):
                    current = current.next
            else:
                current = self.tail
                x = 0
                while x < self.size - index - 1:
                    current = current.pred
                    x += 1
                current.pred.next = current.next
                current.next.pred = current.pred
        
        self.size -= 1 # 记得减1

参考:https://programmercarl.com/

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

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

相关文章

哈希 -- 开散列(哈希桶)

拉链法 这里我们要是用string&#xff08;string来做key&#xff09;来取模&#xff0c;再增加一个模板参数&#xff0c;配一个取模的仿函数即可

leetcode 133. 克隆图

leetcode 133. 克隆图 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node { public int val;…

Flex布局是什么?

一、Flex布局是什么&#xff1f; Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 注意&#xff0c;设为Flex布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效。 二、基本概念 采用Flex布局的元素…

基于JavaWeb(Servlet+jsp)的个人通讯录管理系统(含实验报告)

基于JavaWeb&#xff08;Servletjsp&#xff09;的个人通讯录管理系统&#xff08;含实验报告&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为简单的基于Javaweb实现的个人通讯录管理系统&#xff0c;实现主要功能为用户注册登录、首页展示、用户联…

C++——如何正确的使用STL中的vector?

什么是vector&#xff1f; 在STL&#xff08;标准模板库&#xff09;中&#xff0c;vector是一种动态数组容器&#xff0c;可根据需要自动增长或缩小。它可以存储任意类型的元素&#xff0c;并且支持快速的随机访问。 vector是表示可变大小数组的序列容器vector采用的是连续的…

Java面试题整理(带答案)

目录 TCP和UDP的区别 get和post的区别 Cookie和session的区别 Java的基本类型有哪些&#xff1f; 抽象类和接口区别&#xff1f; 对于堆栈的理解 和equals区别 如何理解Java多态&#xff1f; 创建线程都有哪些方式 脏读、不可重复度、幻读都是什么&#xff1f; Jav…

YUM 升级 PHP7

文章目录 YUM 升级 PHP71. 查看当前 PHP 信息2. YUM 安装 PHP73. 查看 PHP 版本4. 启动PHP-FPM YUM 升级 PHP7 参考地址&#xff1a;网站地址 参考地址&#xff1a;网站地址 1. 查看当前 PHP 信息 # 查看 PHP 版本信息 php -v# 查看 yum 源中 PHP 信息 yum list | grep php2. …

最美壁纸小程序源码全新修复版 带激励广告

最美壁纸小程序源码全新修复版&#xff0c;带激励广告&#xff0c;刚刚修复的&#xff0c;程序包里有安全域名与广告id配置说明&#xff0c;这个源码无PHP后台发布后添加合法域名就可以了。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88368720

【vscode设置ctrl+滑轮调节代码字体大小】

vscode设置ctrl滑轮调节代码字体大小 打开设置之后在搜索框中输入"editor.mouseWheelZoom": true&#xff0c;勾选上对勾就OK了&#xff01; “editor.mouseWheelZoom”: true

左神高阶进阶班4 (尼姆博弈问题、k伪进制、递归到动态规划、优先级结合的递归套路、子串的递归套路,子序列的递归套路,动态规划的压缩技巧)

目录 【案例1 尼姆博弈问题】 【题目描述】 【思路解析】 【代码实现】 【案例2 k伪进制问题】 【题目描述】 【思路解析】 【代码实现】 【案例3 最大路径和】 【题目描述】 【思路解析】 【代码实现】 【案例4 优先级的递归套路】 【题目描述】 【思路解析】…

【Vue】ElementUI实现登录注册+axios全局配置+CORS跨域

目录 一、搭建项目 1.1 安装 Element-UI 1.2 导入组件 1.3 创建登录、注册界面 二、后台交互 2.1 引入axios 2.2 添加vue-axios的全局配置 2.2 ssm项目准备 (后端) 2.2.1 准备数据表 2.2.2 导入ssm项目 2.2.3 编写控制器 2.3 前端编写 2.4 登入测试 2.5 注册测试…

亚马逊云科技携手西门子运用生成式AI之力,打破数据孤岛

2023年&#xff0c;以基于GPT模型对话应用为代表的生成式AI浪潮席卷全球&#xff0c;引起企业广泛关注。自此&#xff0c;由生成式AI引导的企业变革序幕全面展开&#xff0c;企业向数智化转型迈出了坚实的一步。 西门子股份公司&#xff08;以下简称“西门子”&#xff09;是一…

《C++ primer》练习6.54-6.56:函数指针定义并调用

《C primer》里面讲到函数指针定义并调用&#xff0c;做一下练习6.54-6.56&#xff0c;题目如下&#xff1a; vector元素的类型是函数指针的类型是int (*)(int, int)&#xff0c;指向的元素是有两个int形参&#xff0c;返回类型也是int的函数。 #include <vector> #incl…

如何利用人才测评系统提升企业招聘效率

公司需要的是能产出价值的员工&#xff0c;但是要想找到完全符合条件的员工&#xff0c;其实并不容易&#xff0c;尽管应聘的人数很多&#xff0c;但不是跳槽的&#xff0c;就是转行的&#xff0c;要么就只能从应届生培养开始了。 从招聘流程上&#xff0c;以现在的模式&…

使用 PyTorch 的计算机视觉简介 (6/6)

一、说明 本文主要介绍CNN中在pytorch的实现&#xff0c;其中MobileNet 网络&#xff0c;数据集来源&#xff0c;以及训练过程&#xff0c;模型生成和存储&#xff0c;模型调入等。 二、轻量级网络和移动网络 我们已经看到&#xff0c;复杂的网络需要大量的计算资源&#xff0c…

4位密码锁可修改密码及错误报警VHDL

名称&#xff1a;4位密码锁可修改密码及错误报警&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 按键包括&#xff0c;0~9&#xff0c;确认&#xff0c;重置&#xff0c;修改,密码4位 要能设定密码&#xff0c…

【PowerQuery】Python自动刷新本地数据

Python数据刷新是开发爱好者和开发人员开发的PowerBI刷新模块进行数据刷新的手段,Python进行数据刷新是通过刷新PowerBI Desktop 的模式进行数据刷新。目前常用的Python的数据刷新模块是PbixRefresher,图为相关的模块和版本。 由于当前的脚本基于英文版本的PowerBI Desktop进…

罗德里格斯公式

1.点乘 A ⃗ ⋅ B ⃗ ∣ A ⃗ ∣ ∣ B ⃗ ∣ c o s ⟨ A ⃗ , B ⃗ ⟩ \vec{A} \cdot \vec{B} \left | \vec{A} \right | \left | \vec{B} \right | cos\left \langle \vec{A}, \vec{B} \right \rangle A ⋅B ​A ​ ​B ​cos⟨A ,B ⟩ 对应几何意义&#xff1a;向量 A ⃗…

驱动代码整理

一&#xff0c;控制LED灯控制实验 头文件 #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#endif 驱动 #include <linux/init.h> #include <linux/module.h> #include &l…

Vue模板语法【下】事件处理器,表单、自定义组件、通信组件

目录 一、事件处理器 1.1常用的事件修饰符 1.2常用的按键修饰符 二&#xff0c;vue中的表单 三、自定义组件 四&#xff0c;通信组件 一、事件处理器 1.1常用的事件修饰符 Vue的事件修饰符是用来改变事件的默认行为或者添加额外的功能。以下是一些常用的事件修饰符及其…