双向链表结构

news2025/2/27 8:14:37
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);
}

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

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

相关文章

智慧车间MES系统源码,采用java+springboot+vue.js+uniapp技术开发

智慧车间MES系统源码&#xff0c;采用javaspringbootvue.jsuniapp开发 MES系统&#xff08;Manufacturing Execution System&#xff09;是一种面向制造企业车间执行层的生产信息化管理系统&#xff0c;它是企业信息化系统的重要组成部分&#xff0c;是ERP&#xff08;Enterpri…

论文阅读笔记:Equivariant Multi-Modality Image Fusion

论文阅读笔记&#xff1a;Equivariant Multi-Modality Image Fusion 1 背景2 创新点3 方法4 模块4.1 模型假设4.2 U-Fuser4.3 伪感知模块4.4 等变图像融合 5 实验6 疑问 代码&#xff1a;https://github.com/Zhaozixiang1228/MMIF-EMMA 论文&#xff1a;https://arxiv.org/pdf/…

不怕太空物质「撞地球」!中科院团队提出日冕物质抛射识别新方法,接近人类识别结果

日冕物质抛射&#xff08;简称 CME&#xff09;是从太阳抛入行星际空间的大尺度等离子体团&#xff0c;是太阳释放能量的一种形式&#xff0c;也是影响空间天气的主要因素之一。大型日冕物质抛射事件会影响通信、导航、航空活动、电网运行等&#xff0c;为了避免安全威胁和资产…

2024长三角数学建模竞赛B题45页思路论文和代码分析

2024长三角数学建模B题45页论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解、问题4模型的建立和…

Logic Pro X for Mac v11.0.0激活版:专业音频制作软件

对于音乐创作者来说&#xff0c;一个稳定、高效的工作流程至关重要。Logic Pro X for Mac提供了一系列工作流程优化功能&#xff0c;让你能够更快捷、高效地完成音乐创作。从添加音轨、录制音频&#xff0c;到混音和编曲&#xff0c;每一个步骤都如丝般顺滑。同时&#xff0c;L…

网页设计web

效果图代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>* …

【全开源】微凌客洗护小程序支持微信小程序+微信公众号+H5

微凌客洗护小程序是一款基于FastAdminThinkPHP开发的一款微凌客洗护小程序。 功能特性 客户端适配&#xff1a;暂支持微信小程序 多端登录&#xff1a;验证码、账号密码、微信授权 商品管理&#xff1a;支持正常价和会员价 商家管理&#xff1a;平台商家地图定位和企微客服…

单元测试—BMI脚本设计

BMI例题如下&#xff1a; BMI中国计算标准&#xff1a;体质指数&#xff08;BMI&#xff09;体重&#xff08;kg&#xff09;身高^2&#xff08;m&#xff09; 例如&#xff1a;一个人的身高为1.75米,体重为68千克&#xff0c;他的BMI68/(1.75^2)22.2&#xff08;千克/米^2&a…

单链表经典算法 面试题--力扣02.04

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a;创建新链表&#xff1a;大链表和小链表 将pcur节点小于x的值&#xff0c;尾插在小链表中 将pcur节点大于或等于x的值&#xff0c;尾插在大链表中 最终---- return lessHead->…

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服&#xff1a; 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型&#xff1a; proxy代理仓库&#xff1a;代理远程仓库&#xff0c;访问全球中央仓库或其他公共仓库&#xff0c;将资源存储在私…

【工具】macOS、window11访问limux共享目录\共享磁盘,samba服务安装使用

一、samba服务安装 Samba是一个免费的开源软件实现&#xff0c;使得非Windows操作系统能够与Windows系统进行文件和打印服务共享。它实现了SMB/CIFS协议&#xff0c;并且能够在Linux、Unix、BSD等多种系统上运行。 安装 samba&#xff1a; sudo yum install samba配置 samba…

全球知名哲学家思想家颜廷利:将人生黑暗视为一种机遇

在时间的长河中&#xff0c;我们短暂的人生不过是眨眼间的光景。然而&#xff0c;正是这短暂的旅程给予了我们无限的可能性和转变的契机。我们应该勇敢地面对生活中的暗夜&#xff0c;将其视作成长的土壤&#xff0c;让自我在其中焕发出独特的光辉。 当我们在生命的历程中暂停脚…

基于ASN.1的RSA算法公私钥存储格式解读

1.概述 RFC5958主要定义非对称密钥的封装语法&#xff0c;RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥&#xff0c;例如按照RSA算法&#xff0c;公钥是n和e&#xff0c;私钥是d和n。当需要将公私钥保存到文件时&#xff0c;需按照一定的格式保存。本文主要定义公私钥…

002_Anaconda的安装与使用

Python的开发环境 官方介绍&#xff1a;Anaconda&#xff0c;中文大蟒蛇&#xff0c;是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。 比较抽象&#xff0c;看不懂没有关系&#xff0c;慢慢往下看。 很多学习python的初学者甚至学…

Android 触摸事件分离原理

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

Vue的学习 —— <vue组件>

目录 前言 正文 一、选项式API与组合式API 二、生命周期函数 1、onBeforeMount() 2、onMounted() 3、onBeforeUpdate() 4、onUpdated() 5、onBeforeUnmount() 6、onUnmounted() 三、组件之间的样式冲突 四、父组件向子组件传递数据 1、定义props 2、静态绑定props…

Elasticsearch 在滴滴的应用与实践

滴滴 Elasticsearch 简介 简介 Elasticsearch 是一个基于 Lucene 构建的开源、分布式、RESTful 接口的全文搜索引擎&#xff0c;其每个字段均可被索引&#xff0c;且能够横向扩展至数以百计的服务器存储以及处理 TB 级的数据&#xff0c;其可以在极短的时间内存储、搜索和分析大…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《集装箱海港级联物流-能源耦合系统协同优化方法 》

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

jenkins配置不同版本nodeJS,保姆级叫你配置

问题描述&#xff1a;公司jenkins被改了nodejs版本适配其他项目导致以前的项目构建失败&#xff0c;原因就是nodejs版本太高或太低导致&#xff0c;这里教大家不去更改服务器默认版本&#xff0c;当需要特殊版本直接在jenkins里配置即可。 过程 1、安装nodeJS插件 1.1点击管…

XML文件转TXT文件 yolo标签转换(代码可直接使用) 可批量转换

像这样的xml文件&#xff0c;我们可以通过代码批量转换为txt文件格式&#xff1a; 新建一个xml2txt.py文件&#xff0c; 上代码&#xff0c;直接复制粘贴 import xml.etree.ElementTree as ET import osdef convert(size, box):x_center (box[0] box[1]) / 2.0y_center (box…