双向链表

简介: java实现的一个双向链表

java实现双向链表

package com.scc.demo;

public class MyLinkedList {
    private Node first;// 链表中第一个节点
    private Node last;// 链表中最后一个节点
    private int size;// 节点的数量
    // 创链表中的每一个节点

    class Node {
        Node prev;// 上一个节点对象
        Node next;// 下一个节点对象
        Object ele;// 当前节点 元素
        // 添加一个构造方法可以节点时并赋值

        public Node(Object ele) {
            this.ele = ele;
        }
    }

    // 添加数据的第一位
    public void addFirst(Object ele) {
        Node node = new Node(ele);// 节点对象
        // 如果当前节点是第一次添加(当前节点即是开头也是结尾)
        if (size == 0) {
            this.first = node;
            this.last = node;
        } else {
            // 新节点的下一位是原有的节点
            node.next = this.first;
            // 把新增的节点作为原有节点之前的一个节点
            // 即第一个节点
            this.first.prev = node;
            // 需要开始节点更改
            this.first = node;
        }
        size++;
    }

    // 添加最后一位
    public void addLast(Object ele) {
        // 先创建节点
        Node node = new Node(ele);
        if (size == 0) {
            this.first = node;
            this.last = node;
        } else {
            // 当前节点的下一位是新的节点
            this.last.next = node;
            // 新节点的上一位是原有节点
            node.prev = this.last;
            // 更新新节点为下一个节点
            this.last = node;
        }
    }

    @Override
    public String toString() {
        if (size == 0) {
            return "[]";
        }
        StringBuffer sbr = new StringBuffer();
        // 获取第一个节点
        sbr.append("[");
        for (int i = 0; i < size - 1; i++) {
            sbr.append(first.ele);
            if (i != size - 1) {
                sbr.append(",");
            } else {
                sbr.append("]");
            }
            first = first.next;// 获取下一个节点
        }
        return sbr.toString();
    }
    // 删除节点
    public void remove(Object ele) {
        // 找到要删除的节点
        Node first = this.first;
        for (int i = 0; i < size; i++) {
            if (!first.ele.equals(ele)) {
                if (first.next == null) {
                    return;
                }
                first = first.next;
            }
        }
        // 删除节点
        if (first == this.first) {
            this.first = first.next;
            this.first.prev = null;
        } else if (first == last) {
            this.last = first.prev;
            this.last.next = null;
        } else {
            // 把删除节点的上一个节点连接删除节点的下一个节点
            first.prev.next = first.next;
            // 把删除节点的下一个节点连接删除节点的上一个节点
            first.next.prev = first.prev;
        }
        size--;
    }
}
相关文章
|
Web App开发 自然语言处理 Java
Elasticsearch简介及安装
Elasticsearch简介及安装
526 0
|
存储 安全 Shell
⭐⭐⭐【Shell 命令集合 磁盘管理 】Linux 显示当前工作目录的路径 pwd命令使用教程
⭐⭐⭐【Shell 命令集合 磁盘管理 】Linux 显示当前工作目录的路径 pwd命令使用教程
502 0
|
9月前
|
小程序 Java 关系型数据库
weixin025移动学习平台的设计与实现+ssm(文档+源码)_kaic
基于微信小程序的移动学习平台旨在解决传统APP占用过多手机存储空间的问题,提升用户体验。该平台使用微信开发者工具开发前端,SSM框架和Java语言开发后台,并采用MySQL数据库保存数据。系统支持管理员对教师、课程、学生信息进行管理,教师可查看及审核作业,管理课程资源;学生能提交作业、查看审核结果并收藏或评论课程资源。此平台使用户无需安装独立APP即可访问学习内容,极大提升了便捷性和管理效率。 关键词:基于微信小程序的移动学习平台;微信开发者工具;SSM框架
|
10月前
|
SQL 人工智能 大数据
【4月重点功能发布】阿里云大数据+ AI 一体化平台
【4月重点功能发布】阿里云大数据+ AI 一体化平台
258 0
|
JavaScript API
一个简单的Vue移动端抽奖页面的示例
一个简单的Vue移动端抽奖页面的示例
698 1
|
Linux iOS开发 MacOS
Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能
Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能
311 0
|
存储 人工智能 边缘计算
云计算大势所趋:从基础到未来,探析发展趋势
云计算大势所趋:从基础到未来,探析发展趋势
|
数据采集 SQL 弹性计算
重磅发布!阿里云全链路数据湖开发治理解决方案
阿里云重磅发布全链路数据湖解决方案,主要包含开源大数据平台E-MapReduce(EMR) + 一站式大数据数据开发治理平台DataWorks + 数据湖构建DLF + 对象存储OSS等核心产品。
3128 4
重磅发布!阿里云全链路数据湖开发治理解决方案
|
存储 运维 监控
链路追踪(Tracing)其实很简单——分布式链路追踪的应用与兴起
作者:夏明(涯海) 创作日期:2022-07-14 专栏地址:【稳定大于一切】【稳定大于一切】分布式链路追踪已经被广泛应用于中大型企业的 IT 运维领域,为分布式应用的性能诊断与稳定性保障提供了有效的帮助。此外,分布式链路追踪的开源和商业化生态也发展迅猛,大量独立服务商或云厂商纷纷跟进,共同推动了分...
737 0
链路追踪(Tracing)其实很简单——分布式链路追踪的应用与兴起
|
人工智能 计算机视觉
AIGC:推动智慧农业革命的关键驱动力
AIGC:推动智慧农业革命的关键驱动力