毕业设计如何用dw做网站/阿里云com域名注册
双向链表
- 一.双向链表
- 二.创建MyListCode类实现双向链表创建
- 一.AddFirst创建(头插法)
- 二.AddLast创建(尾叉法)
- 三.size
- 四.remove(指定任意节点的首位删除)
- 五.removeAll(包含任意属性值的所有删除)
- 六.AddIndex(给任意位置添加一个节点)
- 七.contains(无)
- 八.partition(区分链表的大小范围)
- 九.display(打印)
- 接口类
- MyListNode整体代码
- Test测试类代码
一.双向链表
单向链表从头部开始我们的每一个节点指向后驱的节点。
此处为单向链表
单向链表
双向链表是相互指向前驱以及后驱的链表
前驱链表我们需要在我们的MyListCode内部类中在定义一个previous来接收每一个前驱的地址
想要删除任意节点可以直接通过访问下一个节点使其prev获取想要删除的上一个节点,然后将想要删除的上一个节点.next获取到被删除对象下一个节点的指向
这里我们可以模拟实现MyListCode类中的一些方法,入头插法、尾叉法、任意位置插入节点、指定元素删除含有该元素的第一个节点、指定元素删除含有该元素的所有节点等…
二.创建MyListCode类实现双向链表创建
public class MyListNode implements IList {static class Node{public int val;//获取的后一个节点public Node next;//获取的前一个节点public Node prev;public Node(int val) {this.val = val;}}//始终在第一个节点public Node head;//指向最后一个节点public Node last;}
一.AddFirst创建(头插法)
这里当头部为null,没有头部和尾巴,我们将新节点作为头和尾,如果不为null,将每次产生的新节点对象放到头部,头部的pre与新节点相连,头部更新最新节点
@Overridepublic void addFirst(int data) {Node node=new Node(data);if(this.head==null){//head指向头部,last指向尾巴this.head=node;this.last=node;}else{//不为空将新节点插入头部并将头部的pre置为新节点,最后更新头部位置node.next=this.head;this.head.prev=node;this.head=node;}}
二.AddLast创建(尾叉法)
这里考虑的是当head为空时,我们的头和尾巴都将获取新的节点,如果不为空,我们只需要移动last,将last的下一个节点获取到新的节点,新的节点pre指向last,最后last走向新节点,得到尾巴
@Overridepublic void addLast(int data) {Node node=new Node(data);if(this.head==null){this.head=node;this.last=node;}else {this.last.next = node;node.prev = last;last=node;}}
三.size
从头部开始遍历或者尾部开始遍历
@Overridepublic int size() {if(this.head==null){return 0;}Node cur=this.head;int count=0;while(cur!=null){count++;cur=cur.next;}return count;}@Overridepublic void display() {Node cur=this.head;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}System.out.println();}
四.remove(指定任意节点的首位删除)
首先判断如果头部值为空,说明没有节点,头部的下一个节点如果为key值则直接返回key(因为这里只是删除一个,所以不考虑多个带key的节点),然后遍历如果最后一个节点为key,它的下一个节点为null,则将双向节点置为null,如果不为null,就删除这个节点
@Overridepublic void remove(int key) {if (this.head == null) {return;}if(this.head.val==key){//头节点为key将其更换为后驱节点,将后驱节点的prev置空this.head=this.head.next;this.head.prev=null;return;}Node cur=this.head.next;while(cur!=null){if(cur.val==key){//最后一个节点为key将前驱的下一项置空并将cur的pre置空if(cur.next==null){cur.prev.next=null;cur.prev=null;return;}else{//不是最后一个节点将前驱节的下一节点为当前节点下一项//当前节点的下一项的前驱为当前项的前驱cur.prev.next=cur.next;cur.next.prev=cur.prev;return;}}cur=cur.next;}}
五.removeAll(包含任意属性值的所有删除)
首先判断是否头部为空
判断最后一个last值是否时key,是key将双节点置空
然后判断key值,将key值在节点中删除
最后判断头节点是否为key,并将头节点置空
@Overridepublic void removeAll(int key) {if(this.head==null){return;}if(this.last.val==key) {//如果最后一项的值为key,将last前一项保留下来,最后赋值给last使其尾部更新Node pre=this.last.prev;this.last.prev.next = null;this.last.prev = null;this.last=pre;}Node cur=this.head.next;while(cur!=null){//cur的值如果为key清理该节点指向if(cur.val==key){cur.prev.next=cur.next;cur.next.prev=cur.prev;}cur=cur.next;}//最后判断head的值是否是keyif(this.head.val==key){this.head=this.head.next;}//如果head有数据将head头的前节点置空if(this.head!=null){this.head.prev=null;}}
六.AddIndex(给任意位置添加一个节点)
首先判断头部是否为空
判断该坐标是否合法,如果该坐标在0或者在尾巴,则头插法和尾叉法
将给的坐标作为循环条件节点开始走,跳出循环后改节点位置就是要添加的位置
首先要把改节点的坐标向后移动一位,插入其中间
单链表的话将cur先指向后一个节点在指向前一个节点
@Overridepublic void addIndex(int index,int data)throws RuntimeException {if(this.head==null){return;}try {if(index<0||index>size()){throw new RuntimeException("错误范围"+size());}}catch (RuntimeException e){e.printStackTrace();}if(index==0){addFirst(data);return;}if(index==size()){addLast(data);return;}Node node=new Node(data);Node cur=this.head;while(index>0){//出来后就是要插入的范围cur=cur.next;index--;}//在任意位置新增一个节点node.next=cur;node.prev=cur.prev;cur.prev=node;node.prev.next=node;return ;}
七.contains(无)
@Overridepublic boolean contains(int key) {if(this.head==null){return false;}Node cur=this.head;while(cur!=null){if(cur.val==key){return true;}cur=cur.next;}return false;}
八.partition(区分链表的大小范围)
@Overridepublic Node partition(Node node,int x) {if (node == null) {return null;}Node cur = node;Node min=null;Node minEnd=null;Node max=null;Node maxEnd=null;while (cur != null) {if(cur.val<x){if(min==null){min=cur;minEnd=cur;}else{minEnd.next=cur;minEnd=minEnd.next;}}else{if(max==null){max=cur;maxEnd=cur;}else{maxEnd.next=cur;maxEnd=maxEnd.next;}}cur = cur.next;}if(min==null){return max;}if(maxEnd!=null){maxEnd.next=null;}minEnd.next=max;return min;}
}
九.display(打印)
@Overridepublic void display() {Node cur=this.head;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}System.out.println();}
接口类
public interface IList {public void display();public int size();public void addFirst(int data);//新增一个节点放到头部public void addLast(int data);//新增一个节点放到尾部public void remove(int key);//删除第一个val值为key的节点public void removeAll(int key);//删除所有val值的节点public void addIndex(int index,int data);//在任意一个位置放入一个节点public boolean contains(int key);//是否包含key数值这个节点public MyListNode.Node partition(MyListNode.Node node,int x);//指定一个值,将数值小的放在前,将数值大的放在后
}
MyListNode整体代码
import java.util.List;public class MyListNode implements IList {static class Node{public int val;public Node next;public Node prev;public Node(int val) {this.val = val;}}//始终在第一个节点public Node head;//指向最后一个节点public Node last;@Overridepublic void addFirst(int data) {Node node=new Node(data);if(this.head==null){this.head=node;this.last=node;}else{node.next=this.head;this.head.prev=node;this.head=node;}}@Overridepublic void addLast(int data) {Node node=new Node(data);if(this.head==null){this.head=node;this.last=node;}else {this.last.next = node;node.prev = last;last=node;}}@Overridepublic int size() {if(this.head==null){return 0;}Node cur=this.head;int count=0;while(cur!=null){count++;cur=cur.next;}return count;}public int size2(){if(this.head==null){return 0;}Node end=this.last;int count=0;while(end!=null){count++;end=end.prev;}return count;}@Overridepublic void display() {Node cur=this.head;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}System.out.println();}public void display2(){Node cur=this.last;while(cur!=null){System.out.print(cur.val+" ");cur=cur.prev;}System.out.println();}@Overridepublic void remove(int key) {if (this.head == null) {return;}if(this.head.val==key){//头节点为key将其更换为后驱节点,将后驱节点的prev置空this.head=this.head.next;this.head.prev=null;return;}Node cur=this.head.next;while(cur!=null){if(cur.val==key){//最后一个节点为key将前驱的下一项置空并将cur的pre置空if(cur.next==null){cur.prev.next=null;cur.prev=null;return;}else{//不是最后一个节点将前驱节的下一节点为当前节点下一项//当前节点的下一项的前驱为当前项的前驱cur.prev.next=cur.next;cur.next.prev=cur.prev;return;}}cur=cur.next;}}@Overridepublic void removeAll(int key) {if(this.head==null){return;}if(this.last.val==key) {//如果最后一项的值为key,将last前一项保留下来,最后赋值给last使其尾部更新Node pre=this.last.prev;this.last.prev.next = null;this.last.prev = null;this.last=pre;}Node cur=this.head.next;while(cur!=null){//cur的值如果为key清理该节点指向if(cur.val==key){cur.prev.next=cur.next;cur.next.prev=cur.prev;}cur=cur.next;}//最后判断head的值是否是keyif(this.head.val==key){this.head=this.head.next;}//如果head有数据将head头的前节点置空if(this.head!=null){this.head.prev=null;}}@Overridepublic void addIndex(int index,int data)throws RuntimeException {if(this.head==null){return;}if(index==0){addFirst(data);return;}if(index==size()){addLast(data);return;}try {if(index<0||index>size()){throw new RuntimeException("错误范围"+size());}}catch (RuntimeException e){e.printStackTrace();}Node node=new Node(data);Node cur=this.head;while(index>0){//出来后就是要插入的范围cur=cur.next;index--;}//在任意位置新增一个节点node.next=cur;node.prev=cur.prev;cur.prev=node;node.prev.next=node;return ;}@Overridepublic boolean contains(int key) {if(this.head==null){return false;}Node cur=this.head;while(cur!=null){if(cur.val==key){return true;}cur=cur.next;}return false;}@Overridepublic Node partition(Node node,int x) {if (node == null) {return null;}Node cur = node;Node min=null;Node minEnd=null;Node max=null;Node maxEnd=null;while (cur != null) {if(cur.val<x){if(min==null){min=cur;minEnd=cur;}else{minEnd.next=cur;minEnd=minEnd.next;}}else{if(max==null){max=cur;maxEnd=cur;}else{maxEnd.next=cur;maxEnd=maxEnd.next;}}cur = cur.next;}if(min==null){return max;}if(maxEnd!=null){maxEnd.next=null;}minEnd.next=max;return min;}
}
Test测试类代码
public class Test {public static void main(String[] args) {MyListNode myListNode=new MyListNode();myListNode.addLast(3);myListNode.addLast(5);myListNode.addLast(7);myListNode.removeAll(6);
// System.out.println(myListNode.last.val);
// myListNode.display();myListNode.addIndex(1,9);System.out.println(myListNode.contains(3));myListNode.display();int len1 = myListNode.size();int len2 = myListNode.size();System.out.println(len1+"size");System.out.println(len2+"size1");MyListNode myListNode1=new MyListNode();myListNode1.addLast(3);myListNode1.addLast(3);myListNode1.addLast(8);myListNode1.addLast(9);myListNode1.addLast(19);myListNode1.addLast(3);myListNode1.display();myListNode1.display2();myListNode1.partition(myListNode1.head,5);myListNode1.display();myListNode1.display2();}
}
写的也有很多不好的地方,希望大佬们多多指点,谢谢!!祝大家开心快乐
相关文章:

java双向链表解析实现双向链表的创建含代码
双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建(头插法)二.AddLast创建(尾叉法)三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…...

【Kafka-go】golang的kafka应用
网络上关于go的Kafka还是比较少的今天就先出一篇入门级别的,之后再看看能能出一个公司业务场景中的消息流。 一、下载github.com/segmentio/kafka-go包 go get github.com/segmentio/kafka-go二、建立kafka连接 正常来说下面的配置host topic partition 应该写在…...

redis:set集合命令,内部编码,使用场景
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码使用场景总结 前言…...

45期代码随想录算法营总结
代码随想录训练营总结与收获 在为期60天的代码随想录训练营结束后,我感慨良多。这段时间不仅让我在编程技能上有了明显的提升,更让我在学习习惯和时间管理上有了深刻的反思和改变。 报名参加这个训练营对我来说是一个重要的监督机制。之前我总是拖延&a…...

深入理解Java中的instanceof关键字及接口新特性:方法实现的可能性
目录 引言 1. 什么是instanceof关键字? 1.1 语法结构 1.2 instanceof的用法示例 1.3 instanceof的应用场景 2. Java中的接口能包含方法实现吗? 2.1 默认方法(Default Method) 2.2 静态方法(Static Method&…...

【python中如果class没有self会怎行】
python中如果class没有self会怎样TOC 在Python中,self是一个约定俗成的名称,用于表示类的实例。如果没有使用self,会导致以下问题: 1、无法访问实例属性: 在类的方法中,如果没有self,方法将无…...

【算法】(Python)动态规划
动态规划: dynamic programming。"programming"指的是一种表格法,而非编写计算机程序。通常解决最优化问题(optimization problem)。将问题拆分成若干个子问题,求解各子问题来得到原问题的解。适用于多阶段…...

EasyExcel 学习之 导出 “提示问题”
EasyExcel 学习之 导出 “提示问题” 现象分析解决(伪代码)前端 POST 实现后端实现 现象 EasyExcel 支持导出 xlsx、xls、csv 三种文件格式。在导出过程中可能发生各种异常,当发生异常时应该提示错误信息而非导出一个错误的文件。 分析 首…...

应用系统开发(3)低功耗四运算放大器LM324N
LM324N 是一种广泛使用的 低功耗四运算放大器,由德州仪器(Texas Instruments)和其他制造商生产。它具有四个独立的运算放大器,能够在单电源或双电源模式下运行,适合多种模拟电路应用。以下是详细信息: 芯片基本信息 型号:LM324N封装类型:常见 DIP(双列直插封装)或 SO…...

基于微信小程序的电商平台+LW示例参考
1.项目介绍 系统角色:管理员、普通用户功能模块:管理员(用户管理、商品分类、商品管理、订单管理、系统管理等),普通用户(个人中心、收藏、我的订单、查看商品等)技术选型:SpringBo…...

[Android] Graphic Buffer 的申请
前言: MediaCodec 支持 texture mode,即MediaCodec解码video完毕后把 yuv 数据填入 GPU 共享出来的 graphic buffer 里面,app 会把 video 的 yuv数据 和 ui 的数据通过通过软件渲染组件(opengl等)发送给GPU 进行一并渲染。这样做的效率较低&…...

【大数据学习 | HBASE高级】storeFile文件的合并
Compaction 操作分成下面两种: Minor Compaction:是选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,对于删除、过期、多余版本的数据不进行清除。 Major Compaction:是指将所有的StoreFile合并成一个StoreFile&am…...

多平台编包动态引入依赖的解决方案
最近开发时遇到了这样的需求,A 平台需要引入一个 video.js,B 平台却是不需要的,那么面向 B 平台打包的时候把依赖装进去自然就不大合适。最好的方法是动态引入依赖,根据平台来判断要不要引入 动态引入依赖 很快啊,动…...

[单例模式]
目录 [设计模式] 单例模式 1. 饿汉模式 2. 懒汉模式 3. 单例模式的线程安全问题 [设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里…...

速盾:游戏盾的功能和原理详解
速盾有一款专注于网络游戏安全的防护系统,它通过实时监测游戏网络流量和玩家行为,以及使用先进的算法和技术进行分析和识别,检测出各种外挂、作弊行为和恶意攻击,从而保障游戏的公平性和玩家的安全性。 速盾游戏盾的主要功能包括…...

Spleeter:音频分离的革命性工具
目录 什么是Spleeter?Spleeter的工作原理Spleeter的应用场景Spleeter的技术优势Spleeter的挑战与局限性结论 什么是Spleeter? Spleeter 是一个由 Deezer 开发的开源音频源分离工具。它基于深度学习技术,尤其是卷积神经网络(CNN&a…...

【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程
文章目录 0. 前言1. 部分观测的马尔可夫决策过程1.1 POMDP的思想以及与MDP的联系1.1.1 MDP的过程回顾1.1.2 POMDP定义1.1.3 与MDP的联系及区别POMDP 视角MDP 视角决策次数对最优解的影响 1.2 POMDP的3种常规解法1.2.1 连续状态的“Belief MDP”方法1. 信念状态的定义2. Belief …...

openresty入门教程:access_by_lua_block
在OpenResty中,access_by_lua_block 是一个功能强大的指令,它允许你在Nginx的访问控制阶段执行Lua脚本。这个阶段发生在Nginx处理请求的过程中,紧接在rewrite阶段之后,但在请求被传递到后端服务器(如PHP、Node.js等&am…...

Caused by: org.apache.flink.api.common.io.ParseException: Row too short:
Flink版本 1.17.2 错误描述 Caused by: org.apache.flink.api.common.io.ParseException: Row too short: 通过flink中的flinkSql直接使用对应的connector去获取csv文件内容,报获取的数据太短了 可能原因 1.创建的表字段多于csv文件当中的表头 定位 在获取csv…...

hbase的安装与简单操作
好的,这里是关于 HBase 的安装和基本操作的详细步骤,分成几个更清晰的阶段: 第一部分:安装和配置 HBase 1. 环境准备 HBase 依赖于 Hadoop,因此首先确保 Hadoop 已经正确安装和配置。如果没有安装,请先下…...

PySpark本地开发环境搭建
一.前置事项 请注意,需要先实现Windows的本地JDK和Hadoop的安装。 二.windows安装Anaconda 资源:Miniconda3-py38-4.11.0-Windows-x86-64,在window使用的Anaconda资源-CSDN文库 右键以管理员身份运行,选择你的安装路径&#x…...

【进阶】Stable Diffusion 插件 Controlnet 安装使用教程(图像精准控制)
Stable Diffusion WebUI 的绘画插件 Controlnet 最近更新了 V1.1 版本,发布了 14 个优化模型,并新增了多个预处理器,让它的功能比之前更加好用了,最近几天又连续更新了 3 个新 Reference 预处理器,可以直接根据图像生产…...

调试、发布自己的 npm 包
查看 npm 的配置 npm config ls登录 whoami 查看当前登录的用户 npm whoamiaduser 登录 adduser 有以下参数: –scope 作用域–registry 注册地址 默认地址:https://registry.npmjs.org/,也可通过.npmrc文件配置 npm login 是 …...

拓扑学与DNA双螺旋结构的奇妙连接:从算法到分子模拟
拓扑的形变指的是通过连续地拉伸、弯曲或扭曲物体而不进行撕裂或粘合来改变其形状的一种数学变换。拓扑形变属于拓扑学的一个分支,研究在这些操作下保持不变的性质。简单来说,它关注的是物体“形状的本质”,而不是具体的几何形状。 拓扑形变…...

mysql数据库(四)单表查询
单表查询 文章目录 单表查询一、单表查询1.1 简单查询1.2where1.3group by1.4having1.5order by1.6limit 一、单表查询 记录的查询语法如下: SELECT DISTINCT(去重) 字段1,字段2… FROM 表名 WHERE 筛选条件 GROUP BY 分组 HAVING 分组筛选 ORDER BY 排序 LIMIT 限…...

JavaEE初阶---properties类+反射+注解
文章目录 1.配置文件properities2.快速上手3.常见方法3.1读取配置文件3.2获取k-v值3.3修改k-v值3.4unicode的说明 4.反射的引入4.1传统写法4.2反射的写法(初识)4.3反射的介绍4.4获得class类的方法4.5所有类型的class对象4.6类加载过程4.7类初始化的过程4…...

HarmonyOS一次开发多端部署三巨头之功能级一多开发和工程级一多开发
功能级一多开发与工程级一多开发 引言功能级一多开发SysCaps机制介绍能力集canlUse接口 工程级一多开发三层架构规范 引言 一次开发多端部署 定义:一套代码工程,一次开发上架,多端按需部署 目标:支撑开发者快速高效的开发多终端设…...

STL常用遍历算法
概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小,只包括几个在序列上面进行简…...

前端开发中常见的ES6技术细节分享一
var、let、const之间有什么区别? var: 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是g…...

行业类别-智慧城市-子类别智能交通-细分类别自动驾驶技术-应用场景城市公共交通优化
1.大纲分析 针对题目“8.0 行业类别-智慧城市-子类别智能交通-细分类别自动驾驶技术-应用场景城市公共交通优化”的大纲分析,可以从以下几个方面进行展开: 一、引言 简述智慧城市的概念及其重要性。强调智能交通在智慧城市中的核心地位。引出自动驾驶…...