java简单实现双链表代码

news2024/9/23 3:18:52
package com.se.day03.aGenericity.eDataStructrue;

/**
 * 自定义一个双链表的数据结构。
 *
 */

public class MyDoubleList<E> {
    //新创建容器时,头部和尾部元素都是null,size0;
    private Node head; //头部元素
    private Node tail;  //尾部元素
    private int size;  // 元素个数

    public void add(E e){
        //先创建一个节点,当前节点的element是e ,
        Node newNode = new Node(e);
        if(head == null){
            //说明该节点是第一个节点添加进来,所以既是头也是尾
            head = newNode;
        }else{
            tail.nextNode = newNode;
            newNode.preNode = tail;
        }
        tail = newNode;
        size++;
    }

    public void addFirst(E e){
        Node newNode = new Node(e);
        if(head == null){
            tail = newNode;
        }else{
            newNode.nextNode =head;
            head.preNode = newNode;
        }
        head = newNode;
        size++;
    }

    /**
     * 向指定索引index处添加索引
     * @param e
     * @param index
     */
    public void add(E e,int index){
        Node newNode = head;
        Node indexNode = new Node(e);
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        //添加到末尾
        if(index == size){
            add(e);
        } else if (index == 0){
            indexNode.nextNode=head;
            head.preNode=indexNode;
            head = indexNode;
            size++;
        } else if(index<size) {
            for (int i = 0; i < index; i++) {
                newNode =newNode.nextNode;
            }
            indexNode.nextNode =newNode;
            indexNode.preNode = newNode.preNode;
            newNode.preNode.nextNode =indexNode;
            newNode.preNode =indexNode;
            size++;
        }
    }

    public E get(int index){
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        Node newNode = head;
        if(index == 0){
            return head.element;
        }
        for (int i = 0; i < index; i++) {
            newNode = newNode.nextNode;
        }
        return newNode.element;
    }
    public E set(int index, E e){
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        Node newNode = head;
        if(index == 0){
            E ret= head.element;
            head.element = e;
            return ret;
        }else{
            for (int i = 0; i < index; i++) {
                newNode = newNode.nextNode;
            }
            E ret= newNode.element;
            newNode.element=e;
            return ret;
        }
    }

    public E remove(int index){
        Node newNode = head;
        if(index < 1 || index > size){
            throw new IndexOutOfBoundsException();
        }
        for(int i = 1; i < index; i++){
            newNode =newNode.nextNode;
        }
        E e = newNode.element;
        newNode.preNode.nextNode =newNode.nextNode;
        newNode.nextNode =newNode.preNode;
        size--;
        return e;
    }

    public String toString(){
        StringBuilder str = new StringBuilder();
        Node temp = head;
        if(temp == null){
            return str.toString();
        }
        for (int i= 0; i <size-1; i++){
            str.append(temp.element).append("<===>");
            temp = temp.nextNode;
        }
        str.append(temp.element).append("   size:").append(size);
        return str.toString();
    }

    public int getSize(){
        return size;
    }
    public void initate(){
        head = null;
        tail = null;
        size = 0;
        System.out.println("----初始化完毕----");
    }

    private class Node{
        E element ;
        Node nextNode;//后一个节点
        Node preNode; //前一个节点
        public Node(){}
        //提供一个参数构造器给当前元素赋值
        public Node(E element){
            this.element = element;
        }
        public Node(E element, Node nextNode, Node preNode){
            this.element = element;
            this.nextNode = nextNode;
            this.preNode = preNode;
        }
    }

    public MyDoubleList(){}
    public MyDoubleList(Node head, Node tail){
        this.head = head;
        this.tail = tail;
    }


    public static void main(String[] args) {
        MyDoubleList<Integer> list = new MyDoubleList<>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        System.out.println(list);
        list.add(111,10);
        System.out.println(list);
        System.out.println("下标为10的元素是"+list.get(10));
        System.out.println("替换的元素是: "+list.set(1,5));
        System.out.println(list);
        System.out.println("删除的元素是"+list.remove(8));
        System.out.println(list);
        list.initate();

    }
}

输出结果:

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

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

相关文章

特殊数组Z(前缀和)

前言&#xff1a;想了好一会才想到是前缀和来写&#xff0c;并且我一开始的是从考虑这个数和这个数后面一个数&#xff0c;导致边界烦了我好久 看了一下&#xff0c;考虑这个数和这个数前一个数更好 class Solution { public:vector<bool> isArraySpecial(vector<int…

按键按下,LED 点亮,但是,理论和现象不符

通过 Debug &#xff0c;解决了一个 Bug&#xff0c;很开心&#x1f604;&#xff0c;记录下 想实现的效果&#xff1a;按下 PB12 上的按钮&#xff0c;PA7 上的 LED 点亮&#xff1b;松开&#xff0c;LED 熄灭 单片机型号&#xff1a;STM32F103C8T6 PB12 为上拉电阻&#xf…

高可用负载均衡集群

高可用负载均衡集群 相比单点的负载均衡集群&#xff0c;高可用负载均衡集群可以解决以下两个问题。 1. real server某个服务down会怎么样&#xff1f;如何解决&#xff1f; 解决 自动调用好的real server 2. scheduler server down会怎么样&#xff1f;如何解决&#xff1f…

Docker容器管理之FAQ

一、前言 某次&#xff0c;某容器服务发现无法使用了&#xff0c;查看状态为restaring状态&#xff0c;后看是云主机重启了&#xff0c;导致本地的nfs-server未自动启动&#xff0c;导致关联的集群主机&#xff0c;远程挂载点无法使用&#xff0c;影响容器服务运行。故此&#…

Qt编译错误: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

方法一&#xff1a;清空构建目录 清空当前目录的多余文件即可&#xff0c;具体操作如下 一个正常的Qt项目刚被创建且没有编译时是这样的 一个main文件&#xff0c;一个pro文件&#xff0c;一个user文件&#xff0c;一个头文件(.h)&#xff0c;和一个源文件(.cpp)&#xff0c;一…

springsecurity的学习(四):实现授权

简介 springsecurity的授权&#xff0c;自定义授权失败的处理&#xff0c;跨域的处理和自定义权限校验方法的介绍 授权 权限系统作用 在后台进行用户权限的判断&#xff0c;判断当前用户是否有相应的权限&#xff0c;必须具有所需的权限才能进行相应的操作&#xff0c;以此…

高通分享:glTF 2.0扩展MPEG、3GPP在AR/VR 3D场景的沉浸式体验

日前&#xff0c;高通技术标准高级总监托马斯斯托克哈默尔&#xff08;Thomas Stockhammer&#xff09;和高通技术标准总监伊梅德布亚齐兹&#xff08;Imed Bouazizi&#xff09;撰文分享了ISO和Khronos之间是如何紧密合作&#xff0c;并最终开发出MPEG-I Scene Description IS…

基于LangChain的大模型学习手册(入门级)

前言 时间轴来到2024年的下半年&#xff0c;“大模型”这个术语&#xff0c;从几乎是ChatGPT的代名词&#xff0c;转变为AI领域一个划时代产品的广泛词汇。从单一到广泛&#xff0c;代表大模型这个世界级产品&#xff0c;正在走向枝繁叶茂的生命阶段。截止现在&#xff0c;目前…

【算法分析与设计】期末复习-小题100道

目录 0、基础知识点 一、单选题 二、多选题 三、判断题 0、基础知识点 &#xff08;1&#xff09;常见时间复杂度与公式&#xff1a; 汉诺塔&#xff1a;T(n)O(2^n) 全排列&#xff1a;T(n)O(n!) 整数划分&#xff1a; 正整数n的划分&#xff1a;p(n)q(n,n) 分治&#…

推荐系统三十六式学习笔记:工程篇.效果保证31|推荐系统的测试方法及常用指标介绍

目录 为什么要关注指标推荐系统的测试方法1.业务规则扫描2.离线模拟测试3.在线对比测试4.用户访谈 常用指标1.系统有多好&#xff1f; 假设你已经有了自己的推荐系统&#xff0c;这个系统已经上线。 为什么要关注指标 面对推荐系统这样一个有诸多复杂因素联动起作用的系统&am…

C++入门:类和对象(入门篇)

目录 前言 类的定义 1.类定义格式 2.从结构体到类的跨越 3.访问限定符 4.类域 5.类的实例化 类的默认成员函数 1.默认成员函数的定义和学习方向 2.构造函数 3.析构函数 4.拷贝构造函数 5.重载运算符 总结 疑难解答 1.this指针的用法 2.为什么拷贝构造函数的第一个参数必须…

LeetCode 热题 HOT 100 (024/100)【宇宙最简单版】

【哈希表】No. 0128 最长连续序列【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&am…

WPF中RenderTransform,LayoutTransform区别

RenderTransform RenderTransform 是在渲染阶段应用的变换。它不会影响控件的布局&#xff0c;只会影响控件的外观。常用于动画和视觉效果。 • 应用时机&#xff1a;在控件已经完成布局之后。 • 影响范围&#xff1a;仅影响控件的外观&#xff0c;不影响布局。 • 常见用途&…

汇川技术|PLC应用逻辑编程技巧(2)

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 昨天看这块儿内容看到快十二点了&#xff0c;还没看完&#xff0c;今天接着看。 以下为学习笔记。 01 PLC程序实现状态关系 该思路编写程序的要点如下&#xff1a; ①&#xff1a;采用PLC的一个整数型变量作为状态位…

路透社中东门户媒体ZAWYA:自带流量为品牌出海赋能

路透社中东门户媒体ZAWYA:自带流量为品牌出海赋能 随着全球化的不断推进&#xff0c;越来越多的企业开始将目光投向海外市场&#xff0c;寻求更广阔的发展空间。然而&#xff0c;在激烈的市场竞争中&#xff0c;如何让自己的品牌脱颖而出成为一个亟待解决的问题。在这个背景下…

Windows 11系统SQL Server 2016 数据库安装 最新2024教程和使用

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 文件可以关注作者公众号《全栈鍾猿》&#xff0c;发您 安装流程 双击运行 在资源管理器页面如图所示 点击全选-->取消勾选如图所示的3个---》点击下一步 点击下一步 安装完成&#xff0c;如图所示 &a…

USB-HUB电路设计

USB-HUB电路设计 USB-HUB电路是笔者任职电子工程师做的第一块板子,功能为USB3.0的集线器,主芯片采用RTS5411,最多能同时工作四个USB3.0设备。 由于信号有TX.RX,我们很容易将发送端和接收端搞错,毕竟从芯片出来,要经过很多的路径,如USB端子,线材,再到芯片。则芯片出来…

内网渗透—横向移动RDPWinRMWinRSSPN扫描Kerberos攻击

前言 今天仍是横向移动的内容&#xff0c;有些实验能成功&#xff0c;有些实验则各种奇怪的问题导致失败&#xff0c;这都是很常见的。就连小迪在视频中也经常翻车&#xff0c;我们只需要知道原理&#xff0c;以及如何去实现这个攻击行为即可。没必要强求所有的实验都要百分百…

Python3网络爬虫开发实战(8)验证码的识别

文章目录 一、 图片增强&#xff1a;OpenCV1. OpenCV 基础使用2. 滑动验证码缺口识别 二、图片验证码和滑块验证码1. tesserocr2. ddddocr3. 深度学习识别4. 超级鹰打码平台 三、手机验证码的自动化处理 目前&#xff0c;许多网站采取各种各样的措施来反爬虫&#xff0c;其中一…

嵌入式面经篇四——内存管理

文章目录 前言一、内存管理&编程题1、由gcc编译的C语言程序占用的内存分为哪几个部分&#xff1f;2、大小端3、全局变量和局部变量的区别&#xff1f;4、以下程序中&#xff0c;主函数能否成功申请到内存空间&#xff1f;5、请问运行下面的 Test() 函数会有什么样的后果&am…