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;确…

SpringCloud Alibaba Sentinel 实现熔断功能

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

[StartingPoint][Tier1]Pennyworth

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

基于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作为整个系统的网关层接入…

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;我们将看到这种组合的一些特征以及一些简单的…

多输入多输出 | 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;就像下面这…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

逆向案例十二——看准网企业信息json格式的信息

网址&#xff1a;【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密&#xff0c;返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

Java 面试宝典:Redis 的线程模型是怎么样的?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 Redis 的线程模型其实是分两块的&#xff1a; Redis 6.0 …

前端开发语言有那些?

前端开发语言有那些&#xff1f; 1、html 超文本标记语言&#xff1a;构建前端网页的基本结构&#xff0c;就象人的骨架一样。 2、css 层叠样式表&#xff1a;控制网页的样式和布局&#xff0c;就象人需要穿各种服式展现不同风采。 3、javascript 简称 JS 动态脚本语言&#x…

阿里面试总结

ThreadLocal 线程变量存放在当前线程变量中&#xff0c;线程上下文中&#xff0c;set将变量添加到threadLocals变量中 Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThreadLocals用来存储当前操作的ThreadLocal的引用及变量对象&#xff0c;把当前线程…

括号串(Deque)

题目 import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();char[] c sc.nextLine().toCharArray();Deque…

Flutter第六弹 基础列表ListView

目标&#xff1a; 1&#xff09;Flutter有哪些常用的列表组建 2&#xff09;怎么定制列表项Item&#xff1f; 一、ListView简介 使用标准的 ListView 构造方法非常适合只有少量数据的列表。我们还将使用内置的 ListTile widget 来给我们的条目提供可视化结构。ListView支持…