做题总结 707. 设计链表
做题总结 707. 设计链表
- leetcode中单链表节点的默认定义
- 我的尝试
- 正确运行的代码(java)
leetcode中单链表节点的默认定义
class ListNode {int val;ListNode next;//无参public ListNode() {}//有参:1public ListNode(int val) {this.val = val;}//有参:2public ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值。
我的尝试
请注意这段代码是错的,请勿参考
错误分析:
① 题目 “你可以选择使用单链表或者双链表,设计并实现自己的链表。” 是使用力扣官方给的单链表和双链表,然后设计实现自己的链表MyLinkedList 。单链表为 ListNode。
② MyLinkedList 中使用 ListNode类。
③ 添加一个变量 size,记录 MyLinkedList 中节点的个数。
④ 【问题】java中 this 指针可以更改指向吗?
⑤ MyLinkedList myLinkedList; myLinkedList.addAtHead(1);
这样是没法调用的,会报错,《might not have been initialized》
⑥ 下文代码中的 this==null 也是多余的,IDEA上说《Condition ‘this == null’ is always ‘false’》。我分析是因为this是 java虚拟机给每个对象分配的,代表当前对象。而对象一定是需要在堆中new出来的。如果只是MyLinkedList myLinkedList;
其实这个变量只是在栈中定义,堆中并没有对象。
⑦ 虚拟头节点/哑节点/dummy head,是为了方便增删。
⑧ 力扣中定义的class是可以加属性的。
//代码是错的,请勿参考。
class MyLinkedList {int val;MyLinkedList next;public MyLinkedList() {this.val = 0;this.next = null;}public int get(int index) {if(index < 0) return -1;//下标无效//this有可能为空吗?int count=0;MyLinkedList h = this;while(h!=null) {if(count == index) {return h.val;}h = h.next;count++;}return -1;}public void addAtHead(int val) {MyLinkedList newhead = new MyLinkedList();newhead.val = val;newhead.next = this;this = newhead;}public void addAtTail(int val) {MyLinkedList newnode = new MyLinkedList();newnode.val = val;newnode.next = null;if(this == null) {this = newnode;} else {MyLinkedList temp = this;while(temp.next != null) {temp = temp.next;}temp.next = newnode;}}public void addAtIndex(int index, int val) {//链表为空:index再合法也没用//index不合法//index超过链表长度//加在中间//加在末尾if(this == null) return;if(index < 0) return;MyLinkedList newnode = new MyLinkedList();newnode.val = val;newnode.next = null;//哑节点MyLinkedList newh = new MyLinkedList();newh.next = this;//tempMyLinkedList temp = newh;//计数int count=0;while(temp.next!=null) {if(count == index) {newnode.next = temp.next.next;temp.next = newnode;return;}count++;temp = temp.next;}if(index == count) {temp.next = newnode;}return;//index超过链表长度}public void deleteAtIndex(int index) {}
}
正确运行的代码(java)
分析:
① get、addAtIndex、 deleteAtIndex中的 for循环查找 index 用的是同一套逻辑,for循环之后,temp所在的位置是 目标为index节点的前一个。
② addAtHead、addAtTail 可以合并到addAtIndex中。
③ size这个变量很巧妙得同时考虑到了,链表为空和 index大于链表长度的情况。
class MyLinkedList {int size;ListNode head;//注意这里是单链表节点 ListNode//虚拟头节点public MyLinkedList() {this.size = 0;head = new ListNode(0);//注意这里是单链表节点 ListNode}public int get(int index) {if(index < 0 || index >=size) {return -1;}ListNode temp = this.head;for(int i=0; i<index; i++) {temp = temp.next;}return temp.next.val;//这里}public void addAtHead(int val) {addAtIndex(0,val);}public void addAtTail(int val) {addAtIndex(size,val);}public void addAtIndex(int index, int val) {if(index < 0 || index > size) {return;}//size避免了链表为空,index大于链表长度的情况ListNode node = new ListNode(val);ListNode temp = this.head;for(int i=0; i<index; i++) {temp = temp.next;}node.next = temp.next;temp.next = node;size++;}public void deleteAtIndex(int index) {if(index < 0 || index >= size) {return;}ListNode temp = this.head;for(int i=0; i<index; i++) {temp = temp.next;}temp.next = temp.next.next;size--;//这里}
}class ListNode {int val;ListNode next;//无参public ListNode() {}//有参:1public ListNode(int val) {this.val = val;}//有参:2public ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
相关文章:

做题总结 707. 设计链表
做题总结 707. 设计链表 leetcode中单链表节点的默认定义我的尝试正确运行的代码(java) leetcode中单链表节点的默认定义 class ListNode {int val;ListNode next;//无参public ListNode() {}//有参:1public ListNode(int val) {this.val val;}//有参:…...
django实现--视图的使用
在 Django 中,视图是处理 Web 请求并返回 Web 响应的组件。Django 提供了两种主要类型的视图:基于函数的视图和基于类的视图。下面详细解释基于类的视图的实现方法、使用以及与基于函数的视图的异同。 基于类的视图的实现方法 继承 Django 的类视图基类…...

【dirty cred】fileManager [XXX]
前言 这应该不是个题,应该是佬为了测试 dirty cred 利用写的。但是环境有问题,测试最多只能向文件中写入 1024MB 的数据。所以竞争窗口太短了,但是似乎替换 credential obj 又是成功的了。感觉是环境的问题。 漏洞分析与利用 一次任意释放…...
线程按顺序循环执行
不瞒大家说,这是之前参加阿里一面的手写编程题,平时不刷题,这个当时花的时间比较多,虽然最后用了很喽比方法写出来了,自己还是很不满意。下面实话也是看了其他大佬的思路,今天重新练了下。 假设有3个线程,依次打印A、B、C,按顺序循环打印100次。 这个其实是线程通信,…...

C# 使用异步委托获取线程返回值
写在前面 异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题。异步委托只能在.Net Framework 框架下使用,.Net Core中会报平台错误,而且使用Task.Result来获取返回值,可以达成同样的目的ÿ…...

生鲜蔬果展示预约小程序作用是什么
线下生鲜蔬果店非常多,对商家来说主要以同城生意为主,而在互联网电商的发展下,更多的商家会选择搭建私域商城进行多渠道的销售卖货和拓展,当然除了直接卖货外,还有产品纯展示或预约订购等需求。 但无论哪种模式&#…...

【C++】类与对象(下)
本文目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 2. static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5. 匿名对象6. 拷贝对象时的一些编译器优化7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&am…...
一文了解 Go 方法
前言 在前面的 一文熟悉 Go 函数 文章中,介绍了 Go 函数的声明,函数的几种形式如匿名函数、闭包、基于函数的自定义类型和函数参数详解等,而本文将对方法进行介绍,方法的本质就是函数,介绍方法的同时也会顺带对比其与函…...

【Docker】vxlan的原理与实验
VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。 VXLAN介绍 VXLAN是在底层…...

广度(宽度)优先搜素——层层递进
分析算法及题目 完整代码实现 广度优先搜索(Breadth-First Search,BFS)是一种图和树的遍历算法,与深度优先搜索相对应。BFS从起始节点开始,首先访问起始节点,然后逐层地访问其邻居节点,直到达到…...

设计模式——建造者模式(创建型)
引言 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码…...
getopt --- C 风格的命令行选项解析器
源代码: Lib/getopt.py 备注 getopt 模块是一个命令行选项解析器,其 API 设计会让 C getopt() 函数的用户感到熟悉。 不熟悉 C getopt() 函数或者希望写更少代码并获得更完善帮助和错误消息的用户应当考虑改用 argparse 模块。 此模块可协助脚本解析 sys.argv 中的…...
Mysql大数据量删除
Mysql大数据量删除 在一些操作中,可能需要清理一下积压的数据,如果数据量小的话自然没有问题,但是如果是个大数据量的问题,那么就该考虑一个合适的办法了。 在清理大数据量的时候需要考虑是清理部分数据还是清理所有数据…...
【python中类的介绍】
python中类的介绍 在Python中,定义类需要使用关键字 class类名通常使用大写字母开头,举例: class MyClass:pass解释:定义了一个MyClass的空类。 1、python中类定义 “”" 类中可以定义属性和方法。 1、属性是类的数据成…...

PO模式在selenium自动化测试框架有什么好处
PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便。 PO模式的全称叫page object model(POM),有时候叫做 p…...

智能优化算法应用:基于斑马算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于斑马算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于斑马算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑马算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…...

deepface:实现人脸的识别和分析
deepface介绍 deepface能够实现的功能 人脸检测:deepface 可以在图像中检测出人脸的位置,为后续的人脸识别任务提供基础。 人脸对齐:为了提高识别准确性,deepface 会将检测到的人脸进行对齐操作,消除姿态、光照和表…...
Pytorch当中nn.Identity()层的作用
在深度学习中,nn.Identity() 是 PyTorch 中的一个层(layer)。它实际上是一个恒等映射,不对输入进行任何变换或操作,只是简单地将输入返回作为输出。 通常在神经网络中,各种层(比如全连接层、卷…...

linux课程第二课------命令的简单的介绍2
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...

【PTA刷题】 求子串(代码+详解)
【PTA刷题】 求子串(代码详解) 题目 请编写函数,求子串。 函数原型 char* StrMid(char *dst, const char *src, int idx, int len);说明:函数取源串 src 下标 idx 处开始的 len 个字符,保存到目的串 dst 中,函数值为 dst。若 len…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...