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日

相关文章

  • Sprint Boot @SessionScope使用方法详解

    在Spring Boot中,@SessionScope注解用于将Bean的生命周期与HTTP会话的生命周期绑定在一起。在本文中,我们将详细介绍@SessionScope注解的作用和使用方法,并提供两个示例。 @SessionScope注解的作用 @SessionScope注解用于将Bean的生命周期与HTTP会话的生命周期绑定在一起。当使用@SessionS…

    Java 2023年5月5日
    00
  • Java中的TreeSet是什么?

    Java中的TreeSet是一个基于红黑树实现的有序集合。它继承自AbstractSet类并实现了NavigableSet接口,可以存储和操作无重复元素的有序元素集合。 创建TreeSet实例 可以通过以下两种方式创建TreeSet实例: // 创建一个空的TreeSet TreeSet<String> treeSet = new TreeSet…

    Java 2023年4月27日
    00
  • 使用jpa之动态插入与修改(重写save)

    下面是使用JPA动态插入与修改的完整攻略: 1. 动态插入与修改简介 Java Persistence API(JPA)是JavaEE标准中的一个API规范,主要用于对象关系映射(ORM),方便程序开发人员通过面向对象的方式来操作关系型数据库。在使用JPA进行数据持久化时,我们通常需要使用一些注解来标记实体类,以及一个Repository来进行数据访问操作。…

    Java 2023年6月15日
    00
  • sprng和struts有什么区别?

    sprng和struts有什么区别? 背景介绍 sprng(简称Spring)和struts是两个常见的Java Web框架,都是基于MVC设计模式。它们都能帮助开发人员加快Web应用程序开发的速度。 区别 1. 关注点不同 Spring框架的主要关注点在于IoC(Inverse of Control,控制反转)和AOP(Aspect-Oriented Pr…

    Java 2023年5月20日
    00
  • java Date获取年月日时分秒的实现方法

    获取当前时间 Java中的Date类可以获取当前系统时间,包含年月日时分秒等信息。获取当前时间的代码如下: import java.util.Date; public class DateUtils { public static void main(String[] args) { Date now = new Date(); System.out.pri…

    Java 2023年5月20日
    00
  • Java中统计字符个数以及反序非相同字符的方法详解

    Java中统计字符个数的方法详解 在Java中可以使用几种方法来统计字符串中字符的个数,下面介绍一些常用的方法。 1.使用for循环 可以使用for循环遍历字符串,逐个判断字符是否相同或满足某些条件,从而统计字符个数。 示例代码: public int countChar(String str, char c) { int count = 0; for (i…

    Java 2023年5月27日
    00
  • SpringMVC文件上传中要解决的问题大汇总

    针对“SpringMVC文件上传中要解决的问题大汇总”的完整攻略,我将从以下几个方面一一介绍: 文件上传的大致流程及相关注意点; 文件上传时可能出现的问题; 解决问题的具体方式及示例。 1. 文件上传的大致流程及相关注意点 一般来说,SpringMVC文件上传的大致流程是这样的: 客户端通过表单提交文件的请求到后台; 后台获取到上传请求后,将文件进行存储。 …

    Java 2023年5月20日
    00
  • 基于Mybatis plus 自动代码生成器的实现代码

    下面就为您详细讲解“基于Mybatis plus 自动代码生成器的实现代码”的完整攻略。首先我们来了解一下Mybatis plus自动代码生成器。 Mybatis plus是Mybatis的增强版,提供了很多实用的功能,其中就包括代码生成器。Mybatis plus代码生成器可以根据数据库表生成对应的JavaBean、Mapper、Service等代码,大大…

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