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日

相关文章

  • 使用spring工厂读取property配置文件示例代码

    首先,需要创建一个property配置文件,我们以”config.properties”为例,文件内容如下: database.url=jdbc:mysql://localhost:3306/mydatabase database.username=root database.password=123456 接下来,我们需要在spring的配置文件中引入该p…

    Java 2023年5月23日
    00
  • 递归形式与非递归形式的斐波那契数列的用法分析

    本篇文章将从递归形式与非递归形式斐波那契数列的定义、算法以及用法进行详细讲解。 1. 定义 斐波那契数列由0和1开始,之后的斐波那契数就是由前两个数相加而得出:0、1、1、2、3、5、8、13、21、34…… 2. 递归形式算法 递归形式算法是以递归方式定义斐波那契数列的算法。具体的方法是,利用函数调用自身的方式实现斐波那契数列的计算。这种算法的优点是逻辑简…

    Java 2023年5月26日
    00
  • java实现动态图片效果

    Java实现动态图片效果攻略 动态图片效果可以为网站增加互动性和吸引力,Java作为一门强大的编程语言,可以实现多种动态图片效果。本文将介绍Java实现动态图片效果的完整攻略。 构建Java Web项目 首先,需要在本地计算机上安装JDK和Eclipse开发工具,然后创建一个Java Web项目。 代码示例: public class HelloWorld …

    Java 2023年5月19日
    00
  • Java探索之Hibernate主键生成策略详细介绍

    Java探索之Hibernate主键生成策略详细介绍 什么是Hibernate主键生成策略 在Hibernate中,主键生成策略是用于生成实体类主键的一种机制。当我们在创建实体类并进行持久化操作时,需要确定该对象的主键。Hibernate提供了多种主键生成策略,开发者可以根据业务场景选择适合的主键生成策略。 Hibernate主键生成策略分类 Hiberna…

    Java 2023年5月19日
    00
  • Spring循环依赖之问题复现详解

    下面我将详细讲解“Spring循环依赖之问题复现详解”的完整攻略,包含两条示例。 Spring循环依赖问题复现详解 什么是Spring循环依赖问题 当两个或更多的bean需要相互依赖时,就会发生Spring的循环依赖问题。当两个bean之间存在依赖时,容器负责解决依赖关系。但是,当存在循环依赖时,容器不能解决这个问题。 如何复现Spring循环依赖问题 下面…

    Java 2023年5月19日
    00
  • Java ConcurrentModificationException异常解决案例详解

    为了解决“Java ConcurrentModificationException异常”,我们需要从以下几个方面入手:原因分析、解决方法和代码示例。 原因分析 Java ConcurrentModificationException 异常通常发生在多个线程操作同一集合对象的时候。在一个线程正在读取该集合的同时,另一个线程修改了该集合,导致第一个线程遍历时出现…

    Java 2023年5月27日
    00
  • 计算机二级考试java软件操作教程 教大家如何学习java

    计算机二级考试Java软件操作教程 为什么学习Java? Java是一门跨平台的编程语言,在开发Web应用、移动应用、桌面应用等众多领域都有广泛应用。学习Java可以让程序员扩展自己的技能树,更好地适应市场需求。而计算机二级考试中也有Java相关的考察内容,学习Java可以更好地准备考试。 学习Java的基本步骤 下载安装Java开发环境(JDK)和集成开发…

    Java 2023年5月20日
    00
  • tomcat 安全规范(tomcat安全加固和规范)

    Tomcat 安全规范 (Tomcat 安全加固和规范) 为什么需要 Tomcat 安全规范? Tomcat 作为一款常用的 Java Web 服务器,因其易用、易安装等特点被广泛应用。但是,由于其安全性较弱,存在着许多潜在的安全风险,例如 SQL 注入、XSS 攻击、未授权访问等。因此,制定 Tomcat 安全规范并严格执行这些规范,可以大大降低安全风险,…

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