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

题意:
在链表类中实现这些功能:
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 = valself.next = nextclass MyLinkedList(object):def __init__(self): # 下方可以直接赋值 里面不用参数也可self.dummy_node = ListNode()self.size = 0 # 注意定义一个 sizedef get(self, index):""":type index: int:rtype: int"""if index < 0 or index >= self.size:return -1current = self.dummy_node.nextfor i in range(index):current = current.nextreturn current.valdef addAtHead(self, val):""":type val: int:rtype: None"""temp = ListNode()temp.val = valtemp.next = self.dummy_node.nextself.dummy_node.next = tempself.size += 1 # 注意 size+1def addAtTail(self, val):""":type val: int:rtype: None"""temp = ListNode()temp.val = valcurrent = self.dummy_nodefor i in range(self.size):current = current.nextcurrent.next = temp# temp.next = None 因为节点定义里面已经有了self.size += 1def addAtIndex(self, index, val):""":type index: int:type val: int:rtype: None"""if index < 0 or index > self.size: # 注意这里没有等于 因为下面是range(index)也不会取到returntemp = ListNode()temp.val = valcurrent = self.dummy_nodefor i in range(index):current = current.nexttemp.next = current.nextcurrent.next = tempself.size += 1 # 注意加1def deleteAtIndex(self, index):""":type index: int:rtype: None"""if index < 0 or index >= self.size:returncurrent = self.dummy_nodefor 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 = valself.pred = predself.next = nextclass MyLinkedList(object):def __init__(self):self.head = Noneself.tail = Noneself.size = 0def get(self, index):if index < 0 or index >= self.size:return -1if index < self.size // 2: # index在前面一半 就用头节点来遍历 current = self.headfor i in range(index):current = current.nextelse:current = self.tail# x = 0# while x < self.size - index - 1:#     current = current.pred#     x += 1for i in range(self.size - index - 1):current = current.predreturn current.valdef addAtHead(self, val):temp = ListNode(val=val, next=self.head) # 记得用selfif self.head:self.head.pred = tempelse: # 需要判断是否存在头节点self.tail = temp # 不存在 那么新节点赋给头尾节点self.head = tempself.size += 1def addAtTail(self, val):temp = ListNode(val=val, pred=self.tail)if self.tail: # 需要判断尾节点是否存在self.tail.next = tempelse:self.tail = tempself.head = tempself.size += 1def addAtIndex(self, index, val):if index < 0 or index > self.size:returnif index == 0:self.addAtHead(val)elif index == self.size:self.addAtTail(val)else:if index < self.size // 2: # 在前面一半current = headfor i in range(index-1):current = current.nextelse:current = self.tailx = 0while x < self.size - index:current = current.predx += 1temp = ListNode(val=val)current.next.pred = tempcurrent.next = tempself.size += 1def deleteAtIndex(self, index):if index < 0 or index >= self.size:returnif index == 0:self.head = self.head.next # 下一个节点是头节点if self.head: # 还需要判断是否存在self.head.pred = Noneelse:self.tail = None # 不存在完全就是空的elif index == self.size - 1: # !!! 很多细节self.tail = self.tail.previf self.tail:self.tail.next = Noneelse:self.head = Noneelse:if index < self.size // 2:current = self.headfor i in range(index):current = current.nextelse:current = self.tailx = 0while x < self.size - index - 1:current = current.predx += 1current.pred.next = current.nextcurrent.next.pred = current.predself.size -= 1 # 记得减1

参考:https://programmercarl.com/

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

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

相关文章

基于MUSIC算法的二维超声波成像matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基本原理 4.2、数学公式 4.3、实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................…

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…

加速乐源码(golang版本)

一、分析 分析过程网上有很多,这里只说个大概,主要是提供golang源码 请求网站,发现前两次请求都会返回521,第三次请求成功,说明前两次请求肯定是干了什么事情;使用接口请求工具模拟请求分析该过程 使用postman工具请求 a. 第一次请求会在响应头返回jsluid,返回内容中拼接…

C++中的Template

模板的概念 建立通用的模具&#xff0c;大大提高复用性 模板不可直接使用 函数模板 函数模板语法 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语法&#xff1a; template&l…

Java JVM(1) - 走进JVM

走进JVM JVM相对于Java应用层的学习难度更大&#xff0c;开篇推荐掌握的预备知识&#xff1a; C/C(关键)、微机原理与接口技术、计算机组成原理、操作系统、数据结构与算法、编译原理&#xff08;不推荐刚学完JavaSE的同学学习&#xff09;&#xff0c;如果没有掌握推荐的一半…

Android 富文本SpannableString

一、认识SpannableString 为什么要使用富文本 在Android开发中&#xff0c;有很多UI会画出一些特别炫酷的界面出来&#xff0c;比如一个字符串里有特殊的字会有其他颜色并加粗、变大变小、插入小图片、给某几个文字添加边框&#xff0c;如果我们使用笨办法用几个TextView或者Im…

Linux上的Pip和Python升级指南

在Linux系统上&#xff0c;保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python&#xff0c;你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在Linux上升级Pip和Python的详细指南&#xff0c;助你打造更强大的开发环境。…

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

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

Anaconda和Pycharm详细安装 配置教程

Anaconda&#xff1a;是一个开源的Python发行版本&#xff0c;其中包含了conda、Python等180多个科学包及其依赖项。【Anaconda下载】 PyCharm&#xff1a;PyCharm是一种Python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。【PyCharm下载】…

mac 配置 httpd nginx php-fpm 详细记录 已解决

在日常mac电脑 开发php项目一直是 httpd 方式 运行&#xff0c;由于有 多版本 运行的需求&#xff0c;docker不想用&#xff0c;索性用 php-fpm进行 功能处理。上次配置 是好的&#xff0c;但是感觉马马虎虎&#xff0c;这次 配置底朝天。因为配置服务器&#xff0c;几乎也都是…

【计算机网络】互联网公司的网络架构和业务场景

互联网公司的网络架构和业务场景 1. 互联网公司网络的组成1.1 网络的物理组成1.2 骨干网组成1.3 数据中心网络组成 2.互联网公司网络服务场景2.1 通用服务场景2.1.1 客户端到服务端请求真实网络过程2.1.2 客户端到服务端请求抽象网络过程2.1.3 负载均衡网络模型 2.2 边缘服务场…

数据湖在爱奇艺数据中台的应用

01 我们眼中的数据湖 作为爱奇艺的数据中台团队&#xff0c;我们的核心任务是管理和服务公司内的大量数据资产。在实施数据治理的过程中&#xff0c;我们不断吸收新的理念&#xff0c;引入尖端的工具&#xff0c;以精细化我们的数据体系管理。“数据湖”作为近年来数据领域广泛…