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。

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

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

相关文章

  • Jdbc的步骤以及简单实现代码

    JDBC是Java Database Connectivity的缩写,它是一种标准的数据库访问方式,可用于连接各种关系型数据库。 JDBC基本步骤包括以下几个环节: 加载数据库驱动程序:通过导入JDBC驱动包将驱动程序加载进来。 建立数据库连接:通过DriverManager类的getConnection方法连接数据库,返回一个Connection对象。 创…

    Java 2023年5月19日
    00
  • maven继承父工程统一版本号的实现

    使用Maven进行项目构建时,我们通常需要对多个子项目进行统一的版本号管理。这时,我们可以使用Maven继承机制来实现。 以下是实现步骤及示例代码: 创建父工程 在pom.xml中设置parent标签,指定父工程版本号: <project> <modelVersion>4.0.0</modelVersion> <gr…

    Java 2023年5月19日
    00
  • 实例讲解java定时任务

    实例讲解Java定时任务的攻略如下: 1. 什么是Java定时任务? Java定时任务是指在预定的时间或间隔时间自动执行任务的一种机制,通常用于需要周期性执行的操作。Java常见的定时任务框架有Timer、ScheduledExecutorService和Quartz等。 2. Java定时任务的实现方式 2.1 Timer Timer是Java自带的定时任…

    Java 2023年6月1日
    00
  • java el简介及用法

    Java EL 简介及用法 Java Expression Language(Java EL)是用于在Java Web应用程序中计算表达式的语言。Java EL 可以在页面中引用或调用Java Bean中的属性、方法等,并能在JSP、JSF、Struts、Spring等框架中使用。 语法 Java EL 对象名称可以分为两部分:对象名称和对象属性。对象名称是…

    Java 2023年6月15日
    00
  • Java Calendar类的时间操作

    那么下面就为您介绍Java Calendar类的时间操作的完整攻略。 一、Java Calendar类简介 Java Calendar类是一个抽象类,它提供了操作日历的相关方法。它可以将日期值(年、月、日、时、分、秒)存储在日历中,同时支持处理日期和时间的各种操作。 二、Java Calendar类的创建 Calendar类是一个抽象类,不能直接创建实例。需…

    Java 2023年5月20日
    00
  • 用于提取网易文件的hta代码

    为了提取网易文件,我们需要将其下载到本地。这个过程可以通过使用.hta文件来完成,它是一种HTML应用程序,用于在本地系统上运行脚本和批处理命令。本教程将向您展示如何利用.hta文件来提取网易云的音乐文件。 步骤一:新建HTA文件 我们先新建一个.hta文件,比如说我们把文件名命名为music.hta。然后在文件中输入以下代码。 <!DOCTYPE h…

    Java 2023年6月15日
    00
  • C#使用动态规划解决0-1背包问题实例分析

    C#使用动态规划解决0-1背包问题实例分析 1. 什么是0-1背包问题? 0-1背包问题是一种典型的NP完全问题,指的是有一个固定容量的背包,若干个物品,每个物品有自己的价值和重量。将部分物品装进背包,使背包装下的物品总价值最大。其中每个物品要么放入背包中,要么不放入,不能拆分物品进行装载。 2. 解决0-1背包问题的动态规划算法 动态规划算法是一种求解复杂…

    Java 2023年5月19日
    00
  • 什么是双亲委派模型?

    以下是关于双亲委派模型的详细讲解: 什么是双亲委派模型? 双亲委派模型是一种类加载机制,它是由 Java 虚拟机(JVM)实现的。在双亲委派模型中,当一个类加载器收到类加载请求时,它首先将请求委派给父类加载器,如果父类加载器无法加载该类,则将请求委派给其子类加载器。这个过程会一直持续到顶层的启动类加载器,如果启动类加载器无法加载该类,则会抛出 ClassNo…

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