数据结构(Java实现)LinkedList与链表(下)

news2024/11/17 23:27:18

在这里插入图片描述
**加粗样式
**
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述
结论
让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

在这里插入图片描述


LinkedList的模拟实现
单个节点的实现
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


尾插
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
运行结果如下:
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
也可以暴力使用
在这里插入图片描述


全部代码
MyLinkedList

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 len=0;
        ListNode cur=head;
        while(cur!=null){
            cur=cur.next;
            len++;
        }
        return len;
    }

    //打印链表
    public  void dispaly(){
        ListNode cur=head;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }

    //查找关键字key是否在链表中
    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=node;
        last=node;
        return;
    }
    //一般情况
    node.next=head;
    head.prev=node;
    head=node;
    }

    //尾插
    public void addLast(int data){
        ListNode node=new ListNode(data);
        //空链表
        if(head==null){
            head=node;
            last=node;
            return;
        }
        //一般情况
        last.next=node;
        node.prev=last;
        last=node;
    }
//无论是头插还是尾插,只要是空链表,那么新增节点的next和prev都引用自身

    //任意位置的插入,在位置后面插入
    public void AddIndex(int index,int data){
        ListNode node=new ListNode(data);

        if(index<0||index>size()){
            throw new IndexOutOfBounds("任意位置插入,坐标非法,非法值为"+index);
        }
        if(index==0){
            addFirst(data);
            return;
        }
        if(index==size()){
            addLast(data);
            return;
        }

        //一般情况
        ListNode cur=head;
        while(index!=0){
            cur=cur.next;
            index--;
        }
        node.next=cur;
        cur.prev.next=node;
        node.prev=cur.prev;
        cur.prev=node;

    }

//删除第一次出现关键字为key的节点
    public void remove(int key){

        //链表为空
        if(head==null){
            return;
        }
        //只有一个节点并且该节点值为key
        if(head.next==null&&head.val==key){
            head.prev=null;
            head.next=null;
            return;
        }
        //头节点
        if(head.val==key)
        {
            head.next.prev=null;
            head=head.next;
            return;
        }
        //尾节点
        if(last.val==key){
            last.prev.next=null;
            last=last.prev;
            return;
        }
        //一般情况
        ListNode cur=head;
        while(cur!=null){
            if(cur.val==key){
                cur.prev.next=cur.next;
                cur.next.prev=cur.prev;
                return;
            }
            cur=cur.next;
        }
    }

    //删除所有出现关键字为key的节点
    public void removeAll(int key){

        //链表为空
        if(head==null){
            return;
        }
        //只有一个节点并且该节点值为key
        if(head.next==null&&head.val==key){
            head.prev=null;
            head.next=null;
            return;
        }
        //头节点
        if(head.val==key)
        {
            head.next.prev=null;
            head=head.next;

        }
        //尾节点
        if(last.val==key){
            last.prev.next=null;
            last=last.prev;

        }
        //一般情况
        ListNode cur=head;
        while(cur!=null){
            if(cur.val==key){
                cur.prev.next=cur.next;
                cur.next.prev=cur.prev;
            }
            cur=cur.next;
        }
    }


    //clear
    public  void clear(){
/*        ListNode cur=head;
        while(cur!=null){
            ListNode curNext=cur.next;//存储下一个节点,方便下次循环使用
            cur.prev=null;
            cur.next=null;
            cur=curNext;//更新当前节点
        }*/
        head=null;
        last=null;//使头节点和尾节点的地址置空
    }

}

IndexOutOfBounds

public class IndexOutOfBounds extends  RuntimeException{
    public IndexOutOfBounds() {
    }

    public IndexOutOfBounds(String message) {
        super(message);
    }
}

Test1

public class Test1 {
    public static void main(String[] args) {
        MyLinkedList myLinkedList=new MyLinkedList();
        myLinkedList.addFirst(34);
        myLinkedList.addFirst(3);
        myLinkedList.addFirst(4);
        myLinkedList.addFirst(340);
        myLinkedList.addFirst(344);
        myLinkedList.dispaly();
        System.out.println(myLinkedList.size());
        System.out.println(myLinkedList.contains(4));
        System.out.println("我是分割线");
        myLinkedList.addLast(-12);
        myLinkedList.addLast(-121);
        myLinkedList.addLast(-1222);
        myLinkedList.dispaly();
        myLinkedList.AddIndex(3,999);
        myLinkedList.dispaly();
       // myLinkedList.AddIndex(55,999);
        System.out.println("我是分割线");
        myLinkedList.remove(999);
        myLinkedList.dispaly();
        myLinkedList.remove(344);
        myLinkedList.dispaly();
        myLinkedList.addFirst(-12);
        myLinkedList.addLast(-12);
        myLinkedList.dispaly();
        myLinkedList.removeAll(-12);
        myLinkedList.dispaly();
        System.out.println("我是分割线");
        myLinkedList.clear();
        myLinkedList.dispaly();
        System.out.println("证明有空行");


    }
}

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


LinkedList的使用
在这里插入图片描述


LinkedList的其他常用方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


LinkedList的遍历
在这里插入图片描述


ArrayList和LinkedList的区别
在这里插入图片描述


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

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

相关文章

React 使用 useRef() 获取循环中所有子组件实例

目录 背景思考实现完整代码&#xff1a;成功运行后的界面如下&#xff1a; 知识点总结uesRef() 作对象处理useImperativeHandle() 父组件操作引入子组件的内部方法最后 背景 之前项目中使用了antd pro 中的 可编辑表格 (EditableProTable)&#xff0c;在页面中表格要经过多层遍…

不用循环数组,js+html实现贪吃蛇

功能描述&#xff1a;每走10步随机改变一个方方向&#xff0c;当键盘按下方向键 w,s,a,d时&#xff0c;使用键盘方向控制蛇的移动&#xff0c;蛇头每撞到一次自身时改变屏幕颜色&#xff0c;蛇头碰到边界时从另一边回来。 实现思路&#xff1a;用个30大小的数组存放每个结点&a…

基于Java+SpringBoot+Vue前后端分离纺织品企业财务管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

nodejs+vue+JavaScript学科竞赛管理系统e41wj

本文拟采用nodejs技术和vue.js搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff0c;设计开发的学科竞赛全流程管理系统。通过调研和分析&#xff0c;系统拥有管理员、教师和学生三个角色&#xff0c;主要具备登录注册、个人信息修改、教师管理、学生管理、竞赛…

【Unity小技巧】unity2d平台制作一根三七调的鱼竿效果(附git源码)

文章目录 前言素材开始源码参考完结 前言 今天我们做一个2d鱼竿的效果&#xff0c;先看一下效果成品效果 素材 鱼竿 开始 首先创建一个2D URP项目 &#xff0c;创建一个空物体作为鱼竿&#xff0c;并创建两个子物体作为开始和结束点 配置层级如下 鱼竿和鱼线加Line Ren…

[Open-source tool] 可搭配PHP和SQL的表單開源工具_Form tools(1):簡介和建置

Form tools是一套可搭配PHP和SQL的表單開源工具&#xff0c;可讓開發者靈活運用&#xff0c;同時其有數個表單模板和應用模組供挑選&#xff0c;方便且彈性。Form tools已開發超過20年&#xff0c;為不同領域的需求者或開發者提供一個自由和開放的平台&#xff0c;使他們可建構…

SQL注入漏洞复现:探索不同类型的注入攻击方法

这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 准备环境 sqlilabs靶场 安装&#xff1a;详细安装sqlmap详细教程_sqlmap安装教程_mingzhi61的博客-CSDN博客 一、基于错误的注入 简介 基于错误的注入&#xff08;Error-based I…

Acrobat Pro DC软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Acrobat Pro DC是Adobe公司开发的一款PDF编辑软件&#xff0c;简称为DC&#xff0c;是Acrobat系列软件中的一款&#xff0c;是行业内的标准工具&#xff0c;被广泛应用于文档处理、电子合同、PDF表单等领域。 Acrobat Pro DC软…

Springboot开发所遇问题(持续更新)

SpringBoot特征&#xff1a; 1. SpringBoot Starter&#xff1a;他将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单&#xff0c;SpringBoot采用 JavaConfig的方式对Spring进行配置…

jvm开启远程调试功能;idea远程debug

概述 有时候一些问题本地调试无法复现&#xff0c;这个时候可以开启jvm的远程调试功能 jar包启动 jdk8 java -agentlib:jdwptransportdt_socket,address8787,servery,suspendn -jar xxx.jarjdk11/17 java -agentlib:jdwptransportdt_socket,address*:8787,servery,suspe…

Java面试题—2023年8月25日—PLKJ

2023年8月25日 北京 png ln kē j 答案仅供参考&#xff0c;博主仅记录发表&#xff0c;没有实际查询&#xff0c;不保证正确性。 面试题&#xff1a; 一.选择题 1.下面哪些是不合法的标识符 A.$persons B.TwoUsers C.*point D._endline 2. 下列语句执行后&#xff0c;k的值为…

银河麒麟服务器、centos7服务器一键卸载mysql脚本

脚本 # 查看mysql相关的rpm包写到rmsql.sh文件中 rpm -aq | grep -i mysql >rmsql.sh # 修改文件为卸载mysql的脚本文件 sed -i -e s/^/yum remove -y / rmsql.sh # 修改文本权限 chmod 777 rmsql.sh # 全盘查找mysql相关文件&#xff0c;写到my.sh脚本中 find / -name mysq…

【win视频播放器】HEVC视频扩展

问题描述&#xff1a; 播放此视频需要新的编解码器 编解码器允许应用读取并播放不同文件。可以从Microsoft Store下载该编解码器 &#xffe5;7.00 现在获取 稍后再说 解决方法&#xff1a; 方法一&#xff1a;&#xff08;该方法我正常使用&#xff09; 链接&#xff1a;ht…

TP-LINK 路由器设置内网穿透

TP-LINK 路由器设置内网穿透 开发中经常遇到调用第三方软件回调调试的情况&#xff0c;例如微信开发&#xff0c;支付回调等测试&#xff0c;用内网穿透是一种简单的方式也是偷懒的方式。 以TP-LINK路由器为例实现内网穿透 登录路由器 2.找到路由器虚拟服务器&#xff0c;添加…

数据库三大范式是什么,又为什么要反范式?

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

2023企业网盘产品排行榜揭晓:选择最适合你的企业网盘工具

企业网盘产品已成为企业文件管理协作的主要选择之一&#xff0c;无论是在文件管理方面&#xff0c;还是团队协作上&#xff0c;企业网盘都表现优秀。为了帮助企业选到心怡的企业网盘产品&#xff0c;我们综合了不同的产品测评网站意见&#xff0c;整理了2023企业网盘产品排行榜…

新版Jadx 加载dex报错 jadx.plugins.input.dex.DexException:Bad checksum 解决方法

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!新版Jadx(1.6+) 加载dex报错 jadx.plugins.input.dex.DexException:Bad checksum 解决方法 环境 win10J…

历史最佳二季度表现后,爱奇艺想为用户提供更多价值

以爱奇艺为首&#xff0c;随着长视频平台相继转变运营思路&#xff0c;走向盈利目标&#xff0c;最早完成蜕变的爱奇艺&#xff0c;已开始迈向下一阶段。 近日&#xff0c;爱奇艺发布了截至6月30日的2023年第二季度财报。除了依然亮眼的内容表现、业绩成果外&#xff0c;爱奇艺…

ARM DIY(四)WiFi 调试

文章目录 焊接打开内核编译选项重新编译内核烧录 && 运行 && 测试完善脚本测速手搓天线正式天线 焊接 换个粗点的风枪嘴&#xff0c;让热风覆盖 RTL8823BS 整体模块&#xff0c;最终实现自动归位 焊接 SDIO 接口的上拉电阻以及复位引脚上拉电阻 硬件部分就这…

S波形及鱼眼扭曲源码

三角波形扭曲&#xff1a; void sinwave(cv::Mat& src,cv::Mat& dst) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);src.copyTo(dst);int PI 3.1415;int RANGE dst.cols/2;for (int i 0; i < dst.rows; i) {double temp (dst.cols - RANGE) / 2 (d…