Java单链表和LinkedList的实现

一、单链表的实现

                无头单向非循环链表

定义异常用于判断所给位置是否合法

public class IndexNotLegal extends RuntimeException{public IndexNotLegal(){}public IndexNotLegal(String smg){super(smg);}
}

class ListNode中包含当前节点的值和下一个节点指向 

实现链表的头插,尾插,任意位置插入,查找,删除一个节点,打印,计数,清空 

import java.util.List;public class MySingleList {//节点class ListNode{public int val;public ListNode next;public ListNode(int val){this.val = val;next = null;}}public ListNode head;//代表链表的头结点//打印public void display(){ListNode cur = head;while(cur!=null){System.out.print(cur.val+"->");cur = cur.next;}System.out.println();}//节点个数public int size(){int count = 0;ListNode cur = head;while(cur!=null){count++;cur = cur.next;}return count;}//头插public void addFirst(int data){ListNode node = new ListNode(data);node.next = head;head = node;}//尾插法public void addLast(int data){ListNode node = new ListNode(data);if(head==null){head = node;return;}ListNode tail = head;while(tail.next != null){tail=tail.next;}tail.next = node;}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data){//判断合不合法try {checkIndex(index);}catch(IndexNotLegal e){e.printStackTrace();}if(index==0){addFirst(data);return;}if(index == size()){addLast(data);return;}ListNode cur = findIndexSubOne(index);ListNode node = new ListNode(data);node.next = cur.next;cur.next = node;}private void checkIndex(int index) throws IndexNotLegal{if(index<0||index>size()){throw new IndexNotLegal("index不合法");}}public ListNode findIndexSubOne(int index){ListNode cur = head;int count =0;while(count!=index-1){cur = cur.next;count++;}return cur;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){ListNode cur = head;while(cur!=null){if(cur.val==key){return true;}cur = cur.next;}return false;}//删除出现关键字为key的节点public void remove(int key){if(head==null){return;}ListNode del = head;ListNode pre = head;while(del!=null){if(del.val==key){pre.next = del.next;del = del.next;}else{pre = del;del = del.next;}}if(head.val==key){head = head.next;return;}//最后判断头结点}public void clear(){ListNode cur = head;while(cur!=null){ListNode curN = cur.next;cur.next = null;cur = curN;}head = null;}
}

二、LinkedList

1、介绍

LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

        LinkedList实现了List接口

        LinkedList的底层使用了双向链表

        LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问

        LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)

        LinkedList比较适合任意位置插入的场景

2、方法介绍

        add

直接增加

插入到指定位置

 addAll:尾插c 中的所有元素

         remove

删除 index 位置元素

删除遇到的第一个 o

 get:获取下标 index 位置元素

set:将下标 index 位置元素设置为 element

clear:清空

contains:判断 o 是否在线性表中

indexOf:返回第一个 o 所在下标

lastIndexOf:返回最后一个 o 的下标

subList:截取部分 list

三、LinkedList遍历方法

public static void main1(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);list.add(2);list.add(1,3);System.out.println(list);//直接打印System.out.println("==============");//foreach遍历for(Integer x: list){System.out.print(x+" ");}System.out.println();System.out.println("============");//for遍历int size = list.size();for (int i = 0; i < size; i++) {System.out.print(list.get(i)+" ");}System.out.println();System.out.println("============");//使用迭代器遍历-正向遍历Iterator<Integer> it = list.iterator();while(it.hasNext()){System.out.print(it.next()+" ");}System.out.println();System.out.println("============");Iterator<Integer> it2 = list.listIterator();while(it2.hasNext()){System.out.print(it2.next()+" ");}System.out.println();System.out.println("============");//使用迭代器遍历-反向遍历ListIterator<Integer> it3 = list.listIterator(list.size());while(it3.hasPrevious()){System.out.print(it3.previous()+" ");}System.out.println();System.out.println("============");}

 

 四、实现MyLikedList

        无头双向链表

定义异常用于判断所给位置是否合法

public class IndexNotIllegal extends RuntimeException{public IndexNotIllegal(){}public IndexNotIllegal(String smg){super(smg);}
}

方法实现 

public class MyLinkedList {static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val){this.val = val;}}public ListNode head;//头结点public ListNode last;//尾节点public int size(){int size = 0;ListNode cur = head;while(cur!=null){size++;cur = cur.next;}return size;}public void display(){ListNode cur = head;while(cur!=null){System.out.print(cur.val+" ");cur = cur.next;}System.out.println();}public boolean contains(int key){ListNode cur = head;while(cur!=null){if(cur.val==key){return true;}cur = cur.next;}return false;}//头插法public void addFirst(int data){ListNode Node = new ListNode(data);if(head==null){head = last = Node;}else{Node.next = head;head.prev = Node;head = Node;}}//尾插法public void addLast(int data){ListNode Node = new ListNode(data);if(head==null){head = last = Node;}else{last.next = Node;Node.prev = last;last = Node;}}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data){try{checkIndex(index);}catch(RuntimeException e){e.printStackTrace();}if(index == 0){addFirst(data);return;}if(index == size()){addLast(data);return;}ListNode cur = findIndex(index);ListNode node = new ListNode(data);node.prev = cur.prev;node.next = cur;cur.prev.next = node;cur.prev = node;}private ListNode findIndex(int index){ListNode cur = head;while(index!=0){cur = cur.next;index--;}return cur;}public void checkIndex(int index)throws IndexNotIllegal{if(index<0||index>size()){throw new IndexNotIllegal("数组下标不合法");}}//删除第一次出现关键字为key的节点public void remove(int key){ListNode cur = head;while(cur!=null){if(cur.val==key) {if (cur == head) {//处理头节点head = head.next;if(head != null){head.prev = null;}else{last = null;}} else {if (cur.next == null) {//处理尾节点cur.prev.next = cur.next;last = last.prev;} else {cur.prev.next = cur.next;cur.next.prev = cur.prev;}}return;//删完一个就跳出}cur = cur.next;}}//删除所有值为key的节点public void removeAllKey(int key){ListNode cur = head;while(cur!=null){if(cur.val==key) {if (cur == head) {//处理头节点head = head.next;if(head != null){head.prev = null;}else{last = null;}} else {if (cur.next == null) {//处理尾节点cur.prev.next = cur.next;last = last.prev;} else {cur.prev.next = cur.next;cur.next.prev = cur.prev;}}}cur = cur.next;}}//得到单链表的长度public void clear(){ListNode cur = head;while(cur!=null){ListNode curN = cur.next;cur.next = null;cur.prev = null;cur = curN;}head = last = null;}}

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

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

相关文章

nginx支持的多种负载均衡策略

目录 1.轮询&#xff08;默认&#xff09; 2. ip_hash 3. 加权轮询&#xff08;weight&#xff09; 4. fair&#xff08;第三方&#xff09; 5. 最少连接&#xff08;least_conn&#xff09; 1.轮询&#xff08;默认&#xff09; 将请求依次分配给每个服务器&#xff0c;确…

自定义OPPO-r9s的kernel内核,并开启安卓支持docker

0. 版本说明 本文提供了OPPO手机r9s的内核编译方法&#xff0c;并开机支持docker。用的是开源lineage14.1的rom。 我这边基于开源lineage14.1&#xff0c;打了一个docker内核编译镜像(17380582683/r9s)&#xff0c;大家可以在容器里&#xff0c;手动打出完整的rom包zip文件。…

SpringCloud Alibaba Sentinel 实现熔断功能

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十六篇&#xff0c;即使用 Sentinel 实现熔断功能。 二、 Ribbon 系列 首先我们新建两个服务的提供者…

vue3 keep-alive include失效问题

在使用vue3 keep-alive时&#xff0c;发现并没有起作用, 代码如下&#xff1a; <template><div class"app-main"><router-view v-slot"{ Component }"><keep-alive :include"cachedViews && cachedViews.map((x:any) &…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署&#xff08;CI/CD&#xff09;工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务&#xff0c;例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…

python使用selenium模拟人工操作

概述 有时候业务中的一些固定流程的测试环境需要重复执行很多次&#xff1b;这种场景其实可以用python的selenium库模拟用户手动点击输入&#xff0c;实现自动化测试&#xff1b; 我这边的python版本是 Python 3.6.7rc2 demo # codingutf-8 import time import logging imp…

Debian 安装 python 3.9.6

安装相关依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev 下载Python 源码 wget https://mirrors.aliyun.com/python-release/source/Py…

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代&#xff0c; 不同系统之间大多数是通过http调用&#xff0c;调用过程中会超时、异常等过种问题。为了保证业务稳定&#xff0c;http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用&#xff0c;实现方…

SQL 注入之 Windows/Docker 环境 SQLi-labs 靶场搭建!

在安全测试领域&#xff0c;SQL注入是一种常见的攻击方式&#xff0c;通过应用程序的输入执行恶意SQL查询&#xff0c;从而绕过认证和授权&#xff0c;可以窃取、篡改或破坏数据库中的数据。作为安全测试学习者&#xff0c;如果你要练习SQL注入&#xff0c;在未授权情况下直接去…

深入浅出 -- 系统架构之负载均衡Nginx实现高可用

一、Nginx的高可用 线上如果采用单个节点的方式部署Nginx&#xff0c;难免会出现天灾人祸&#xff0c;比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭....哈哈哈&#xff0c;夸张了。但实际生产环境中确实存在隐患问题&#xff0c;由于Nginx作为整个系统的网关层接入…

安卓手机APP开发的音频和视频概述

安卓手机APP开发的音频和视频概述 目录 概述 Jetpack Media3 回放组件 Media3 MediaSession MediaSessionService MediaController MeidaBrowser Media3 Exoplayer 编辑组件 Media3 Transformer Effects EditedMediaItem UI组件 Media3 UI Jetpack MediaRouter…

anylabeling使用和安装

源码地址&#xff1a; git clone https://github.com/vietanhdev/anylabeling.git Auto Labeling with Segment Anything Youtube Demo: https://www.youtube.com/watch?v5qVJiYNX5KkDocumentation: https://anylabeling.nrl.ai Features: Image annotation for polygon, r…

利用Leaflet + React:构建WEBGIS

React是 Facebook 开发的一个开源库&#xff0c;用于构建用户界面。就其本身而言&#xff0c;Leaflet是一个用于将地图发布到网络的JavaScript 库。这两个工具的组合很简单&#xff0c;允许您创建动态网络地图。在本文中&#xff0c;我们将看到这种组合的一些特征以及一些简单的…

查找题(二分解法c++)

文章目录 【深基13.例1】查找题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码如下&#xff1a; 【深基13.例1】查找 题目描述 输入 n n n 个不超过 1 0 9 10^9 109 的单调不减的&#xff08;就是后面的数字不小于前面的数字&#xff09;非负整数 a 1 , a…

数据结构DAY3--栈与队列

栈&#xff1a; 是一种只能从一端操作的表&#xff0c;规则为先进后出。 主要操作步骤为&#xff1a;1.建立相关结构体 2.建立栈 3.增加栈 4.获得栈顶值 5.删除 6.修改 7.销毁 1.建立两个结构体 一个为链栈&#xff0c;一个为结点&#xff0c;链栈包括栈头&#xff08;指针…

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

java数据结构与算法刷题-----LeetCode367. 有效的完全平方数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 自实现Math.sqrt()函数&#xff1a;牛顿迭代法 自实现Math.sqrt(…

Redis单线程 VS 多线程

一、Redis 为什么选择单线程&#xff1f; 这种说法其实并不严谨&#xff0c;为什么这么说呢&#xff1f; Redis的版本有很多 3.x、4.x、6.x&#xff0c;版本不同架构也不同的&#xff0c;不限定版本问是否单线程也是不太严谨。 版本3.x&#xff0c;最早版本&#xff0c;也就…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD&#xff0c;MVC相关的内容。 1&#xff1a;MVC 不管我们做什么项目&#xff0c;自己想想其实只是做了三件事&#xff0c;如下&#xff1a; 其实&#xff0c;这三件事完全在一个类中做完也可以可以正常把项目完成的&#xff0c;就像下面这…