707.设计链表

707.设计链表

https://leetcode.cn/problems/design-linked-list/description/

单链表实现

单链表的创建需要一个头节点,它不存储值但指向第一个元素,便于后续的增删改查操作的实现

注意:

  • 复用 addAtIndex 函数实现添加头尾节点的功能
class ListNode{int val;ListNode next;public ListNode(int val){this.val = val;this.next = null;}
}public class MyLinkedList {ListNode head;int size;public MyLinkedList(){size = 0;head = new ListNode(0);}public int get(int index) {if(index < 0 || index >= size) return -1;ListNode curNode = head;for(int count = 0; count <= index; ++count){curNode = curNode.next;}return curNode.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;ListNode curNode = head;// 注意这里 count 没有 <= index,所以取的是index前一个节点for(int count = 0; count < index; ++ count){curNode = curNode.next;}ListNode addNode = new ListNode(val);++size;addNode.next = curNode.next;curNode.next = addNode;}public void deleteAtIndex(int index) {if(index < 0 || index >= size) return;ListNode curNode = head;for(int count = 0; count < index; ++ count){curNode = curNode.next;}curNode.next = curNode.next.next;--size;}
}

双链表实现

双链表的实现,需要头,尾节点
注意:

  • 双链表则可以将头或尾节点作为起始点进行查找
  • 将链表分为两半,判断当前需要查找的节点距离哪一端更近,可以遍历更少的节点
class ListNode{int val;ListNode next;ListNode prev;public ListNode(int val){this.val = val;this.next = null;this.prev = null;}
}class MyLinkedList {private ListNode head;private ListNode tail;private int size;public MyLinkedList() {head = new ListNode(0);tail = new ListNode(0);head.next = tail;tail.prev = head;size = 0;}public int get(int index) {if(index < 0 || index >= size) return -1;ListNode curNode;if(index + 1 < size - index){ // 在前半部分curNode = head;for(int i = 0; i <= index; ++i){curNode = curNode.next;}}else{ // 从后半部分遍历curNode = tail;for(int i = 0; i < size - index; ++i){curNode = curNode.prev;}}return curNode.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;ListNode curNode, prevNode;if(index + 1 < size - index){curNode = head;for(int count = 0; count <= index; ++ count){curNode = curNode.next;}prevNode = curNode.prev;}else{curNode = tail;for(int i = 0; i < size - index; ++i){curNode = curNode.prev;}prevNode = curNode.prev;}ListNode addNode = new ListNode(val);addNode.prev = prevNode;addNode.next = curNode;prevNode.next = addNode;curNode.prev = addNode;++size;}public void deleteAtIndex(int index) {if(index < 0 || index >= size) return;ListNode curNode;if(index + 1 < size - index){curNode = head;for(int i = 0; i <= index; ++i){curNode = curNode.next;}}else{curNode = tail;for(int i = 0; i < size - index; ++i){curNode = curNode.prev;}}--size;curNode.prev.next = curNode.next;curNode.next.prev = curNode.prev;}
}

我的实现

没有注意双链表的特性,依然用单方向的遍历实现

class ListNode{int val;ListNode next;ListNode prev;public ListNode(int val){this.val = val;this.next = null;this.prev = null;}
}class MyLinkedList {private ListNode head;private ListNode tail;private int size;public MyLinkedList() {head = new ListNode(0);tail = new ListNode(0);head.next = tail;tail.prev = head;size = 0;}public int get(int index) {if(index < 0 || index >= size) return -1;ListNode curNode = head;for(int count = 0; count <= index; ++ count){curNode = curNode.next;}return curNode.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;ListNode curNode = head;for(int count = 0; count <= index; ++ count){curNode = curNode.next;}ListNode prevNode = curNode.prev;ListNode addNode = new ListNode(val);addNode.prev = prevNode;addNode.next = curNode;prevNode.next = addNode;curNode.prev = addNode;++size;}public void deleteAtIndex(int index) {if(index < 0 || index >= size) return;ListNode curNode = head;for(int count = 0; count <= index; ++ count){curNode = curNode.next;}--size;curNode.prev.next = curNode.next;curNode.next.prev = curNode.prev;}
}

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

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

相关文章

《整机柜服务器通用规范》由OCTC正式发布!浪潮信息牵头编制

近日&#xff0c;中国电子工业标准化技术协会开放计算标准工作委员会&#xff08;OCTC&#xff09;正式批准发布了《整机柜服务器通用规范》&#xff0c;该标准由浪潮信息牵头&#xff0c;中国工商银行、中国质量认证中心、英特尔、中国计量科学研究院等十余家单位联合编制&…

SLAM PnP问题以及相关基础知识

目标泛函 目标泛函是在优化问题中使用的一种数学工具&#xff0c;目标泛函是一个函数&#xff0c;它将一个或多个函数映射到一个实数。它常用于描述需要最小化或最大化的函数。在优化问题中&#xff0c;我们通常希望找到使得某个特定函数取得最大值或最小值的变量值。目标泛函…

鸿蒙开发ArkTS基础学习-开发准备工具配置

文章目录 前言1. 准备工作2.开发文档3.鸿蒙开发路径一.详情介绍二.DevEco Studio安装详解-开发环境搭建2.1配置开发环境欢迎各位读者阅读本文,今天我们将介绍鸿蒙(HarmonyOS)应用开发的入门步骤,特别是在准备工作和开发环境搭建方面的重要信息。本文将对鸿蒙官方网站的关键…

Java—Throwing Exceptions

一、指定方法引发的异常 上一节展示了如何为ListOfNumbers类中的writeList&#xff08;&#xff09;方法编写异常处理程序。有时&#xff0c;代码捕获可能在其中发生的异常是适当的。然而&#xff0c;在其他情况下&#xff0c;最好让调用堆栈更上层的方法处理该异常。例如&…

51系列--数码管显示的4X4矩阵键盘设计

本文介绍基于51单片机的4X4矩阵键盘数码管显示设计&#xff08;完整Proteus仿真源文件及C代码见文末链接&#xff09; 一、系统及功能介绍 本设计主控芯片选用51单片机&#xff0c;主要实现矩阵键盘对应按键键值在数码管上显示出来&#xff0c;矩阵键盘是4X4共计16位按键&…

工科数学基础系列(1)——矩阵微分

工科数学基础系列文章 下面是工科数学基础系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 数学基础系列文章链接 下面是专栏地址&#xff1a; 工科数学基础系列专栏 文章目录 工科数学基础系列文章数学基础系列文章链接工科数学基础系列专栏 前言工科数…

系列十二、Linux中安装Zookeeper

一、Linux中安装Zookeeper 1.1、下载安装包 官网&#xff1a;Index of /dist/zookeeper/zookeeper-3.4.11 我分享的链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14Hugqxcgp89f2hqGWDwoBw?pwdyyds 提取码&#xff1a;yyds 1.2、上传至/opt目录 1.3、解…

ffmpeg 解码文件时的时间戳问题

实时流和普通文件 1 实时流 实时流编码时&#xff0c;我们一般不进行b帧编码&#xff0c;但是文件存储时为了减小大小&#xff0c;会增加b帧&#xff0c;实时流只带了I&#xff0c;P帧&#xff0c;那就会好很多 2 普通文件 很多文件带了b帧&#xff0c;所以要使用解码时间去同…

SpringMVC之视图和RESTful

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 &#xff08;1&#xff09; 线程同步概念 竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常. 饥饿问题&#xff1a;只使用互相锁保证线程安全时&#xff0c;锁资源总被某…

篇章二 | Python 入门指南:深入理解基础数据类型

Python 是一门强大而易学的编程语言&#xff0c;而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型&#xff0c;包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等&#xff0c;同时提供注意事项和与 C 语言的区…

【浏览器】Web存储梳理和总结

目录 1. 前言 2. cookie 3. sessionStorage和localStorage 4. indexedDB 4.1 IDBFactory原型对象的方法&#xff08;indexedDB是IDBFactory的实例化对象&#xff09; 4.2 操作请求IDBOpenDBRequest和IDBRequest&#xff08;IDBRequest继承于EventTarget&#xff09; 4.3 …

浅谈【GPU和CPU】

GPU和显卡的区别 GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;通常指的就是显卡。显卡是一种安装在计算机中的扩展卡&#xff0c;主要用于图形和图像处理任务。 GPU作为显卡的核心组件&#xff0c;负责处理图形渲染、图像处理、视频解码和其他…

每天坐在电脑前10小时的投资者的现货黄金投资秘密

很多人在现货黄金市场中苦作舟&#xff0c;希望通过交易、实践来找出市场中的奥秘。笔者最近看了一个每天坐在电脑面前十个小时以上做分析和投资的投资者的经验介绍&#xff0c;他道出了一些投资的秘密&#xff0c;笔者认为&#xff0c;这是适合现货黄金投资者借鉴和学习的&…

派生类的构造与析构函数(C++)

3.3 派生类的构造与析构函数3.3.1 构造3.3.2 析构 3.3 派生类的构造与析构函数 3.3.1 构造 如果子类构造函数没有显式指明基类部分&#xff08;基类子对象&#xff09;的初始化方式&#xff0c;那么编译器将会自动调用基类的无参构造函数来初始化基类子对象。 如果希望以有参…

java SSM课程平台系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM课程平台系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

【方法】Word文档如何设置密码?

Word文档可以设置密码保护&#xff0c;如果想要保护文档不被随意打开&#xff0c;可以设置“打开密码”&#xff1b;如果想保护文档不被随意编辑&#xff0c;可以设置“限制密码”&#xff1b;如果当心自己不小心修改了文档&#xff0c;可以设置“只读模式”密码&#xff0c;使…

一篇文章带你入门PHP魔术方法

PHP魔术方法 PHP 中的"魔术方法"是一组特殊的方法&#xff0c;它们在特定情况下自动被调用。这些方法的名称都是以两个下划线&#xff08;__&#xff09;开头。魔术方法提供了一种方式来执行各种高级编程技巧&#xff0c;使得对象的行为可以更加灵活和强大。以下是一…

DSG YashanDB数据交互解决方案:更稳、更快、更安全

近期&#xff0c;深圳计算科学研究院&#xff08;简称“深算院”&#xff09;携手迪思杰&#xff08;北京&#xff09;数据管理技术有限公司&#xff08;简称“DSG”&#xff09;重磅推出基于崖山数据库的数据交互解决方案&#xff0c;具备双向迁移同步、性能稳定、支持复杂对象…

余弦相似度算法

余弦相似度算法 是什么 余弦距离&#xff0c;也称为余弦相似度&#xff0c;是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似&#xff0c;这就叫"余弦相似性&q…