无头双向不循环链表的模拟

news2024/10/3 8:16:32

总共由四部分组成,一个拥有总体方法名+参数 的接口、一个异常类、一个方法类、一个测试类

先看我们写入的接口

public interface ILinkList {
    // 2、无头双向链表实现

        //头插法
     void addFirst(int val);
        //尾插法
        void addLast(int val);
        //任意位置插入,第一个数据节点为0号下标
       void addIndex(int index,int val);
        //查找是否包含关键字key是否在单链表当中
      boolean contains(int val);
        //删除第一次出现关键字为key的节点
    void remove(int val);
        //删除所有值为key的节点
        void removeAllKey(int val);
        //得到单链表的长度
     int size();
      void display();
       void clear();

}

再看我们写的异常类

public class indexNotLegalException extends RuntimeException {
    public  indexNotLegalException(){

    }
    public  indexNotLegalException(String msg){
        super(msg);
    }
}

模拟链表类我们一一来罗列

这次由于是双向链表,所以我们在ListNode内部类中多了一个元素,增加了前驱结点

成员变量中也加入了prev

先写size,display和contains方法,因为前驱结点的增加不影响这三个方法的书写

头插与尾差由于多了一个前驱结点,所以要分析为空的情况,创建新的节点,使得新节点的前驱后继都为null

指定位置的插入需要考虑的有点多

1先捕捉异常,给的指定位置是否合法

2.如果大小为0,则进行头插,如果大小为size,则进行尾差

3.如果在中间,就用方法找到index位置的链表,进行插入

下图为index位置链表查找以及判断index是否合法

移除链表第一个指定元素

看起来繁琐,其实不繁琐

先考虑链表是否为空,如果为空不进行操作,创建cur来遍历链表

如果找到了,判断是不是头结点的

1.如果是头结点判断有没有下一个数据,两个处理起来不一样,如果存在,head=head.next,前驱再置空,如果不存在,head已经是null,直接last置空即可

2.如果不是头结点就直接前一个节点的后继结点为当前的下一个,如果是尾节点直接last向前一步,如果不是,改变下一个的前驱结点为当前节点的前一个

然后直接返回,如果没找到继续遍历,直到遍历完

移除所有链表的指定元素

只需要将返回删除即可,一直遍历,直到结束

模拟方法的类总代码:

public class MyLinkList implements ILinkList{
    public static class ListNode{
        public int val;
        public ListNode prev;
        public ListNode next;
        public ListNode(int val){
            this.val=val;
        }
    }
    ListNode head;
    ListNode last;
    @Override
    public int size() {
        ListNode cur=head;
        int count=0;
        while(cur!=null){
            count++;
            cur=cur.next;
        }
        return count;
    }

    @Override
    public void display() {
        ListNode cur=head;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }

    @Override
    public void clear() {
    ListNode cur=head;
    ListNode next;
    while(cur!=null){
        next=cur.next;
        cur.prev=cur.next=null;
        cur=next;
    }
    head=null;
     last=null;
    }
    @Override
    public void addFirst(int val) {//头插
        ListNode node = new ListNode(val);
        if (head == null) {
            head = last = node;
            head.prev = head.next = null;
        } else {
            node.next = head;
            head.prev = node;
            head = node;
        }
    }

    @Override
    public void addLast(int val) {
        ListNode node=new ListNode(val);
        if (head == null) {
            head = last = node;
            head.prev = head.next = null;
        } else {
          last.next=node;
          node.prev=last;
          last=node;
        }
    }

    @Override
    public void addIndex(int index, int val) {
        try{
            cheakIndexOfAddIndex(index);
        }catch(indexNotLegalException e) {
            e.printStackTrace();
        }
        if(index==0){
            addFirst(val);//头插
            return ;
        }
        if(index==size()){
            addLast(val);//尾差
            return;
        }
        //
        ListNode cur=findeIndexOfNode(index);
        ListNode node=new ListNode(val);
        node.next=cur;
        node.prev=cur.prev;
        node.prev.next=node;
        node.next.prev=node;
    }
    private ListNode findeIndexOfNode(int index){//找到index位置
        ListNode cur=head;
        while(index>0){
            cur=cur.next;
            index--;
        }
        return cur;
    }
    private void cheakIndexOfAddIndex(int index) throws indexNotLegalException{//判断index是否合法
        if(index<0||index>size()){
            throw new indexNotLegalException("index大小不合法");
        }
    }

    @Override
    public boolean contains(int val) {
        ListNode cur=head;
        while(cur!=null){
          if(cur.val==val){
              return true;
          }
          cur=cur.next;
        }
        return false;
    }

    @Override
    public void remove(int val) {
ListNode cur=head;
    while(cur!=null){
        if (cur.val==val) {
            if(cur==head){
                head=head.next;
                if(head!=null){
                    head.prev=null;
                }else{
                        last=null;
                }
            }else{
                cur.prev.next=cur.next;
                if(cur.next==null){
                    last=last.prev;
                }else{
                    cur.next.prev=cur.prev;

                }
            }
            return;
                }
                    cur=cur.next;

        }
    }

    @Override
    public void removeAllKey(int val) {
        ListNode cur=head;
        while(cur!=null){
            if (cur.val==val) {
                if(cur==head){
                    head=head.next;
                    if(head!=null){
                        head.prev=null;
                    }else{
                        last=null;
                    }
                }else{
                    cur.prev.next=cur.next;
                    if(cur.next==null){
                        if(last!=head)
                        last=last.prev;
                    }else{
                        cur.next.prev=cur.prev;

                    }
                }
            }
            cur=cur.next;

        }
    }


}

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

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

相关文章

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…

Unity Input System自动生成配置

参考视频 创建及配置新输入系统 New Input System&#xff5c;Unity2022.2 最新教程《勇士传说》入门到进阶&#xff5c;4K_哔哩哔哩_bilibili ProjectSettings设置 Unity编辑器菜单栏选择Edit->Project Settings->Player->Other Settings,将Api Compatibility Level…

Ascend C 算子运行资源管理简介

Ascend C 算子运行资源管理简介 在 Ascend C 平台上开发深度学习应用时&#xff0c;运行资源的管理是一个核心知识点。通过合理管理算子执行中的计算资源&#xff0c;能够有效提升模型的执行效率和硬件利用率。本文将简要介绍 Ascend C 算子运行时的资源管理。 1. AscendCL 初…

draw.io创建自定义形状

Create custom shapes in draw.io using the text editor Reference draw怎么创建和编辑复杂的自定义形状 https://blog.csdn.net/u012028275/article/details/113828875 Create custom shapes in draw.io using the text editor

AMD发布首个AI小语言模型:6900亿token、推测解码提速3.88倍

AMD发布了自己的首个小语言模型(SLM)&#xff0c;名为“AMD-135M”。相比于越来越庞大的大语言模型(LLM)&#xff0c;它体积小巧&#xff0c;更加灵活&#xff0c;更有针对性&#xff0c;非常适合私密性、专业性很强的企业部署。 AMD-135小模型隶属于Llama家族&#xff0c;有两…

5分钟学会SPI

SPI 定义&#xff1a;SPI 是一种机制&#xff0c;允许用户在不修改现有代码的情况下扩展和替换特定服务的实现。它定义了一组接口&#xff08;Service Interfaces&#xff09;和一组实现&#xff08;Service Providers&#xff09;&#xff0c;使得应用程序可以动态加载和使用…

netty之Netty与SpringBoot整合

前言 在实际的开发中&#xff0c;我们需要对netty服务进行更多的操作&#xff0c;包括&#xff1b;获取它的状态信息、启动/停止、对客户端用户强制下线等等&#xff0c;为此我们需要把netty服务加入到web系统中。 MyChannelInitializer public class MyChannelInitializer ex…

[C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过

官方框架&#xff1a; https://github.com/ultralytics/ultralytics yolov8官方最近推出yolov11框架&#xff0c;标志着目标检测又多了一个检测利器&#xff0c;于是尝试在windows下部署yolov11的tensorrt模型&#xff0c;并最终成功。 重要说明&#xff1a;安装环境视为最基…

边缘自适应粒子滤波(Edge-Adaptive Particle Filter)的MATLAB函数示例,以及相应的讲解

目录 讲解 初始化 预测步骤 观测模拟 权重更新 重采样 状态估计 总结 下面是一个简单的边缘自适应粒子滤波&#xff08;&#xff09;的函数示例&#xff0c;以及相应的讲解。 程序源代码&#xff1a; function X_est edgeAdaptiveParticleFilter(numParticles, numS…

awd基础学习

一、常用防御手段 1、改ssh密码 passwd [user] 2、改数据库密码 进入数据库 mysql -uroot -proot 改密码 update mysql.user set passwordpassword(新密码) where userroot; 查看用户信息密码 select host,user,password from mysql.user; 改配置文件 &#xff08;否则会宕机…

笔记整理—linux进程部分(6)进程间通信、alarm和pause

两个进程间通信可能是任何两个进程间的通信&#xff08;IPC&#xff09;。同一个进程是在同一块地址空间中的&#xff0c;在不同的函数与文件以变量进程传递&#xff0c;也可通过形参传递。2个不同进程处于不同的地址空间&#xff0c;要互相通信有难度&#xff08;内存隔离的原…

2024-09-27 buildroot C和语言将 中文的GBK编码转换为 UTF-8 的代码, printf 显示出来,使用 iconv 库去实现。

一、GBK 的英文全称是 "Guobiao Kuozhan"&#xff0c;意为 "National Standard Extended"。它是对 GB2312 编码的扩展&#xff0c;用于表示更多汉字和符号 GBK&#xff08;国标扩展汉字编码&#xff09;是一种用于简体中文和繁体中文字符的编码方式&#x…

计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习

《PythonSpark知识图谱酒店推荐系统》开题报告 一、研究背景与意义 随着互联网技术的飞速发展和人们生活水平的提高&#xff0c;旅游和酒店行业迎来了前所未有的发展机遇。然而&#xff0c;面对海量的酒店信息和多样化的用户需求&#xff0c;如何快速、准确地为用户推荐符合其…

【Java】—— 集合框架:List接口常用方法与List接口的实现类

目录 4. Collection子接口1&#xff1a;List 4.1 List接口特点 4.2 List接口方法 4.3 List接口主要实现类&#xff1a;ArrayList 4.4 List的实现类之二&#xff1a;LinkedList 4.5 List的实现类之三&#xff1a;Vector 4.6 练习 4. Collection子接口1&#xff1a;List …

PCL 点云直通滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 直通滤波实现 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xf…

CS-BP预测 | MATLAB实现CS-BP布谷鸟搜索算法优化BP神经网络多变量时间序列预测

CS-BP预测 | MATLAB实现CS-BP布谷鸟搜索算法优化BP神经网络多变量时间序列预测 目录 CS-BP预测 | MATLAB实现CS-BP布谷鸟搜索算法优化BP神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现CS-BP多变量时间序列预测(布谷鸟搜索算法优化B…

VMware中Ubuntu系统Docker正常运行但网络不通(已解决)

问题描述&#xff1a;在VMware中的Ubuntu系统下部署了Docker&#xff0c;当在docker容器中运行Eureka微服务时&#xff0c;发现Eureka启动正常&#xff0c;但无法通过网页访问该容器中Eureka。 解决办法如下&#xff1a; 1、创建桥接网络&#xff1a;test-net sudo docker n…

媲美GPT-4o mini的小模型,Meta Llama 3.2模型全面解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

高性能架构—存储高性能

1 &#x1f4ca;关系型数据库 存储技术飞速发展&#xff0c;关系型数据的ACID特性以及强大的SQL查询让其成为各种业务系统的关键和核心存储系统。 很多场景下的高性能设计最核心的就是关系型数据库的设计&#xff0c;很多数据库厂商再优化和提升单个数据库服务器的性能方面做了…

网络原理-数据链路层

在这一层中和程序员距离比较遥远&#xff0c;除非是做交换机开发&#xff0c;否则不需要了解数据链路层 由AI可知&#xff1a; 数据链路层&#xff08;Data Link Layer&#xff09;是OSI&#xff08;Open Systems Interconnection&#xff09;七层网络模型中的第二层&#xff0…