双向链表结构

1.双向链表定义

        双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向直接前驱和直接后继。

2.实现双向链表
        2.1创建双向链表类
/**
 * 基于双向链表实现元素存取的容器
 * @param <E>
 */
public class MyDoubleLinkedList<E> implements MyList<E> {
    /**
     * 向双向链表中添加元素的方法
     * @param element
     */
    @Override
    public void add(E element){

    }

    /**
     * 根据指定位置获取元素
     * @param index
     * @return
     */
    @Override
    public E get(int index){
        return null;
    }

    /**
     * 返回元素的个数
     * @return
     */
    @Override
    public int size(){
        return 0;
    }

    /**
     * 根据指定位置删除元素
     * @param index
     * @return
     */
    @Override
    public E remove(int index){
        return null;
    }
    
    public static void main(String[] args){

    }
}
        2.2创建节点类
/**
 * 定义双向链表的节点对象     
 */
class Node<E>{
    E item;//记录元素
    
    Node<E> prev;//记录前一个节点对象

    Node<E> next;//记录下一个节点对象
    
    Node(Node<E> prev,E item,Node<E> next){
        this.prev = prev;
        this.item = item;
        this.next = next;
    } 
}
        2.3实现添加元素方法
private Node head;//记录头节点

private Node tail;//记录尾节点

private int size;//记录元素个数
/**
 * 向双向链表中添加元素的方法
 * @param element
 */
@Override
public void add(E element){
    this.linkLast(element);
}

/**
 * 将节点对象添加到双向链表的尾部
 */
private void linkLast(E element){
    //获取尾节点
    Node t = this.tail;
    //创建节点对象
    Node<E> node = new Node<>(t,element,null);
    //将新节点定义为尾节点
    this.tail = node;
    if(t == null){
        this.head = node;
    }else{
        t.next = node;
    }
    this.size++;
}
        2.4实现获取元素方法
/**
 * 根据指定位置获取元素
 * @param index
 * @return
 */
@Override
public E get(int index){
    //对Index做合法性校验
    this.checkIndex(index);
    //根据位置查找节点对象
    Node<E> node = this.getNode(index);
    return node.item;
}

/**
 * 校验Index的合法性
 */
private void checkIndex(int index){
    if(!(index >= 0 && index < this.size)){
        throw new IndexOutOfBoundsException("Index: "+index+" Size: "+size);
    }
}

/**
 * 根据位置获取指定节点对象
 */
private Node getNode(int index){
    //判断当前位置距离头或者尾哪个节点更近
    if(index < (this.size >> 1)){
        Node node = this.head;
        for(int i=0;i<index;i++){
            node = node.next;
        }
        return node;
    }else{
        Node node = this.tail;
        for(int i=this.size-1;i>index;i--){
            node = node.prev;
        }
        return node;
    }
}
        2.5实现删除元素方法
/**
 * 根据指定位置删除元素
 * @param index
 * @return
 */
@Override
public E remove(int inedx){
    //对Index进行合法性校验
    this.checkIndex(index);
    //根据指定位置获取节点对象
    Node<E> node = this.getNode(index);
    //获取节点对象中的元素
    E item = node.item;
    //判断当前节点是否为头节点
    if(node.prev == null){
        this.head = node.next;
    }else{
        //完成当前节点的直接前驱节点与当前节点的直接后继节点的挂接
        node.prev.next = node.next;
    }

    //判断当前节点是否为尾节点
    if(node.next == null){
        this.tail = node.prev;
    }else{
        //完成当前节点的直接后继节点与当前节点的直接前驱节点的挂接
        node.next.prev = node.prev;
    }

    //当前节点断掉与它直接前驱节点的连接
    node.prev = null;
    node.item = null;
    //记录元素个数
    this.size--;
    return item;
}
        2.6获取元素的个数
/**
 * 返回元素的个数
 * @return
 */
@Override
public int size(){
    return this.size;
}
        2.7实现在双向链表的头添加元素
/**
 * 在双向链表的头添加元素
 */
public void addFirst(E element){
    this.linkFirst(element);
}

/**
 * 在链表的头添加元素
 */
private void linkFirst(E element){
    //获取头节点对象
    Node head = this.head;
    Node node = new Node(Null,element,head);
    //将新节点定义为头节点
    this.head = node;
    //判断当前链表中是否有节点,如果没有,那么该节点既是头节点也是尾节点
    if(head == null){
        this.tail = node;
    }else{
        head.prev = node;
    }

    //记录元素个数
    this.size++;
}
        2.8实现在双向链表的尾添加元素
/**
 * 在链表的尾添加元素
 * @param element
 */
public void addLast(E element){
    this.linkLast(element);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式六大原则之依赖倒置原则

文章目录 概念逻辑关系 小结 概念 依赖倒置原则指在设计代码架构时&#xff0c;高层模块不应该依赖底层模块&#xff0c;二者都应该依赖抽象。抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象。 逻辑关系 如上图所示&#xff0c;逻辑应该就是这样&#xff0c;高层依赖于…

企业微信网页应用开发(java版)

1、成为开发者 企业微信先认证企业,成为开发者,到开发者中心创建web应用 开发者中心 选择工具 2、创建一个web应用 填写web应用信息 填写配置开发信息 域名地址先填一样的,填好后创建应用 3、配置可信域名 点击检查可信域名归属 下载可信域名验证文件 将下好的文件放到…

[案例分享] 产品需求跨职能团队协作

跨职能团队协作不仅可以激发创新、提升生产力&#xff0c;还能促进业务目标的达成。

最新版★重大升级★神点云连锁餐饮V2独立版点餐系统★公众号/h5/小程序前后端全套源码

提醒&#xff1a; 市场上流通很多老版本代码&#xff0c;一大堆问题且无法保证售后的源码&#xff0c;请各位买家一定要睁大眼睛&#xff0c;以防上当受骗&#xff01;&#xff01;&#xff01;本系统源码全是经本人亲自测试与修复的完好版本&#xff0c;且本人用此版本源码已…

Milvus 快速入门

引言 在本篇文章中&#xff0c;我们将介绍 Milvus 的基本概念&#xff0c;并通过一个简单的示例展示如何在 Milvus 中创建集合、插入向量和执行搜索。最后&#xff0c;我们将概览 Milvus 提供的 API。 一、基本概念 1.1 集合 (Collection) 在 Milvus 中&#xff0c;集合类似…

Ubuntu 24 换国内源及原理 (阿里源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources &#xff08;阿里源&#xff09; Types: deb deb-src URIs: https://mirrors.aliyun.com/ubunt…

学习笔记:使用Ollama项目快速本地化部署Qwen 1.5模型

Ollama简介 Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型。它的主要特点是将模型权重、配置和数据捆绑到一个包中&#xff0c;从而优化了设置和配置细节&#xff0c;包括GPU使用情况&#xff0c;简化了在本地运行大型模型的过程。Ollama支持macOS和Li…

【Javaer学习Python】2、Django的MVT设计模式,完成CRUD小应用

系列文章&#xff1a;学习Python Django的MVT设计模式由Model(模型), View(视图) 和Template(模板)三部分组成&#xff0c;分别对应单个app目录下的models.py, views.py和templates文件夹。它们看似与MVC设计模式不太一致&#xff0c;其实本质是相同的&#xff1b; 实践是检验学…

LabVIEW静止无功补偿监控系统

LabVIEW静止无功补偿监控系统 随着电力系统和电力电子技术的快速发展&#xff0c;静止无功补偿器作为提高电网质量和稳定性的关键设备&#xff0c;其监控系统的研发显得非常重要。详细介绍基于LabVIEW的SVC监控系统的设计与实现过程&#xff0c;可为电力系统的优化和电力电子技…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 驾校管理系统 设计与实现

一.项目介绍 系统角色&#xff1a;管理员、驾校教练、学员 管理员&#xff1a; 个人中心&#xff1a;修改密码以及个人信息修改 学员管理&#xff1a;维护学员信息&#xff0c;维护学员成绩信息 驾校教练管理&#xff1a;驾校教练信息的维护 驾校车辆管理&…

Android 触摸事件分离原理

什么是触摸事件分离&#xff1f; 屏幕上存在多个窗口时&#xff0c;多指触摸的情况下&#xff0c;多个手指的触摸事件可以分给不同的窗口&#xff0c;以下面的图为例&#xff0c;第一个手指按下&#xff0c;window1可以响应这个事件&#xff0c;第二个手指按下&#xff08;第一…

AI应用案例:吸烟打电话行为识别推理

使用百度PaddlePaddle&#xff08;现更名为PaddlePaddle-GPU或PaddlePaddle-CPU&#xff09;框架来构建精准的人员抽烟、打电话动作识别模型&#xff0c;并将其应用于加油站监控场景&#xff0c;你可以遵循以下步骤&#xff1a; 数据准备&#xff1a; 收集抽烟和打电话行为的图…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑网络重构和应急资源的灾后配电网信息物理系统协调恢复方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【Maven】Nexus私服简介_下载安装_登录

1、简介 1.1介绍 Nexus私服&#xff0c;也被称为Maven仓库管理器&#xff0c;是许多公司在自己的局域网内搭建的远程仓库服务器。提供了强大的仓库管理功能和构件搜索功能&#xff0c;使得开发人员能够更方便地管理和使用Maven项目中的依赖库。 1.2作用 内网访问&#xff1…

总台,电视台媒体邀约现场报道,应注意以下几点?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请中央电视台&#xff08;总台&#xff09;这样的权威媒体来报道会议活动&#xff0c;需要注意以下几个关键要点&#xff1a; 提前规划&#xff1a;由于总台的新闻选题流程较为严格和…

2024CCPC郑州邀请赛暨河南省赛(A,B,C,D,F,G,H,J,K,L,M)

2024 National Invitational of CCPC (Zhengzhou), 2024 CCPC Henan Provincial Collegiate Programming Contest 2024 年中国大学生程序设计竞赛全国邀请赛&#xff08;郑州&#xff09;暨第六届 CCPC 河南省大学生程序设计竞赛 比赛链接 这场的题说实话难度其实都不大&…

24个AI写作网站汇总,免费ai工具,把AI用好工作效率真的能提高300%!

从去年到今年&#xff0c;可谓是AI爆发之年&#xff0c;各种AI工具也是层出不穷。随着openai的暴堆算力以及chatgpt人工智能算法的不断进步&#xff0c;ai正在大跨步的向前迈进。 ai可说是集中了全人类的智慧&#xff0c;未来ai的发展我是不敢想象的。不过在今天&#xff0c;如…

element select下拉框编辑时回显已经删除的数据

<el-form-item label"是否激活" prop"activationId"><el-selectv-model"formParams.activationId"style"width: 140px"clearableplaceholder"请选择"><el-optionv-for"item in activationList":ke…

CentOS7使用Docker安装Redis图文教程

1.拉取Redis镜像 这里制定了版本&#xff0c;不指定默认latest最新版 docker pull redis:6.0.8提示信息如下即为下载成功 2.上传配置文件 官方配置文件&#xff08;找自己对应的版本&#xff09;&#xff1a;reids.conf 或者将如下配置文件命名为redis.conf&#xff0c;上…

Kubernetes的Service类型详解

1. Service详解 1.1 Service介绍 在Kubernetes中&#xff0c;Service资源解决了Pod IP地址不固定的问题&#xff0c;提供了一种更稳定和可靠的服务访问方式。以下是Service的一些关键特性和工作原理&#xff1a; Service的稳定性&#xff1a;由于Pod可能会因为故障、重启或扩…