Java实现自定义LinkedList类的示例代码

下面是Java实现自定义LinkedList类的攻略:

1. LinkedList类的概述

LinkedList是Java API中提供的一种线性数据结构,实现了List和Deque接口,底层使用双向链表实现。LinkedList的特点是支持插入和删除操作,但查找操作比较慢。对于需要频繁增删元素而不需要随机访问的场景,使用LinkedList比较合适。

2. 自定义LinkedList类的实现

Java中提供的LinkedList类已经比较完善,但我们还是可以模仿它的实现,自己编写一个自定义的LinkedList类。以下是自定义LinkedList类的示例代码:

public class MyLinkedList<E> {

    private Node<E> head;
    private int size;

    private static class Node<E> {
        E data;
        Node<E> prev;
        Node<E> next;

        Node(E element, Node<E> prev, Node<E> next) {
            this.data = element;
            this.prev = prev;
            this.next = next;
        }
    }

    public MyLinkedList() {
        head = new Node<>(null, null, null);
        head.prev = head;
        head.next = head;
        size = 0;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void add(E element) {
        add(size, element);
    }

    public void add(int index, E element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException();
        }

        Node<E> newNode = new Node<>(element, null, null);
        Node<E> p = head;
        for (int i = 0; i < index; i++) {
            p = p.next;
        }

        newNode.prev = p;
        newNode.next = p.next;
        p.next.prev = newNode;
        p.next = newNode;

        size++;
    }

    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }

        Node<E> p = head;
        for (int i = 0; i < index; i++) {
            p = p.next;
        }

        E element = p.next.data;
        p.next.next.prev = p;
        p.next = p.next.next;

        size--;

        return element;
    }

    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }

        Node<E> p = head.next;
        for (int i = 0; i < index; i++) {
            p = p.next;
        }

        return p.data;
    }
}

3. 具体说明

自定义LinkedList类包含一个内部类Node,表示双向链表中的一个节点,其中data表示节点的数据,prev和next表示节点的前驱和后继。头节点head的data值为null,prev和next均指向自身,表示空链表。size表示链表中元素的个数。

构造函数中初始化头节点head,并使其prev和next均指向自身。

size()方法返回链表中元素的个数。

isEmpty()方法判断链表是否为空。

add(E element)方法向链表末尾添加一个元素。

add(int index, E element)方法在指定位置添加一个元素。该方法先判断索引位置是否合法,然后依次找到要添加位置的前驱节点p,创建一个新节点newNode,并将newNode的前驱和后继指向p和p的后继节点,然后将p的后继节点的前驱指向newNode,p的后继指向newNode。

remove(int index)方法移除指定位置的元素。该方法先判断索引位置是否合法,然后依次找到要移除位置的前驱节点p,将要移除的元素保存下来,将p的后继节点的后继节点的前驱指向p,p的后继指向p的后继节点的后继节点。

get(int index)方法获取指定位置的元素。该方法先判断索引位置是否合法,然后依次找到指定位置的节点p,返回其data值。

4. 示例

MyLinkedList<String> list = new MyLinkedList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list.get(1)); // 输出 b
list.remove(0);
System.out.println(list.get(0)); // 输出 b
System.out.println(list.size()); // 输出 2

以上示例中,我们创建了一个自定义的LinkedList对象list,向其中添加了三个元素a、b、c,并输出了下标为1的元素b的结果。然后移除了下标为0的元素a,并输出了下标为0的元素b的结果,以及list的元素个数2。

阅读剩余 65%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现自定义LinkedList类的示例代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • freemarker 数字格式化深入理解

    Freemarker是一个功能强大的Java模板引擎,它可以帮助我们以更加灵活和高效的方式生成各种文本格式。数字格式化是Freemarker的一个重要特性,它提供了许多选项来格式化数字类型数据,并且还支持各种自定义格式化方式。本文将深入探讨Freemarker数字格式化的原理和用法。 数字格式化语法 Freemarker的数字格式化语法类似于Java的Dec…

    Java 2023年6月15日
    00
  • Tomcat 与 maven 的安装与使用教程

    Tomcat 与 Maven 的安装与使用教程 Tomcat 是一个常用的 Java Web 应用程序的部署容器,Maven 是一个常用的 Java 项目构建工具,在 Java 开发中两者经常被用到。下面是 Tomcat 和 Maven 的安装及使用教程。 1. 安装 Tomcat Tomcat 的官方网站是 http://tomcat.apache.org…

    Java 2023年5月19日
    00
  • 基于SpringBoot 使用 Flink 收发Kafka消息的示例详解

    下面是关于“基于SpringBoot使用Flink收发Kafka消息的示例详解”的攻略。本攻略将包含两个示例主要是为了演示如何使用SpringBoot和Flink收发Kafka消息。其中,例子一是演示如何使用Flink从Kafka主题读取消息,而例子二是演示如何使用SpringBoot将消息发送到Kafka主题。 示例1:使用Flink从Kafka读取消息 …

    Java 2023年5月20日
    00
  • 关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    关于在IDEA中SpringBoot项目中activiti工作流的使用详解,我将按照以下步骤给出完整攻略: 1. 导入activiti依赖 在SpringBoot项目中使用activiti需要导入相应的Maven依赖。可以在pom.xml文件中添加如下依赖: <dependency> <groupId>org.activiti<…

    Java 2023年6月16日
    00
  • 在windows下揪出java程序占用cpu很高的线程并完美解决

    以下是针对“在 Windows 下揪出 Java 程序占用 CPU 很高的线程并完美解决”的完整攻略: 1. 使用 Java 可视化工具揪出占用 CPU 较高的线程 步骤1:下载 VisualVM VisualVM 是一款 Java 虚拟机监控和性能分析工具,可以在 Windows 等多个平台上使用,具有良好的界面和体验。可以到以下网址下载 VisualVM…

    Java 2023年5月19日
    00
  • spring boot 使用Mybatis-plus查询方法解析

    Spring Boot使用Mybatis-Plus查询方法解析 Mybatis-Plus简介 Mybatis-Plus是一个Mybatis的增强工具,在Mybatis的基础上扩展了一些实用的功能,例如分页、逻辑删除、自动填充等。 配置Mybatis-Plus 在Spring Boot项目中使用Mybatis-Plus需要先配置相关依赖,可以在pom.xml文…

    Java 2023年5月20日
    00
  • Java 数据库连接池DBPool 介绍

    Java 数据库连接池DBPool 介绍 什么是数据库连接池 在Java中,如果我们要通过jdbc来操作数据库,需要先建立与数据库的连接。而在多线程环境下,如何高效地管理这些连接,又如何防止频繁地打开和关闭连接,这就需要数据库连接池来实现了。 数据库连接池,简单来说就是提前初始化一定数量的数据库连接,然后将这些连接放在一个队列中,当需要连接数据库时,直接从池…

    Java 2023年5月20日
    00
  • 详解Java中用于国际化的locale类

    详解Java中用于国际化的Locale类 Locale类是Java用于处理地域性信息的一个重要类,在Java中,通常用来做国际化和本地化。 什么是Locale类? Locale是一个Java类,它代表一个特定的地域、文化和语言环境。它包含了一些常见的属性,如语言、国家和地区等。Locale类提供了一种标准的方式来处理本地化和国际化内容。 如何使用Locale…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部