java数据结构实现双向链表功能

 更新时间:2021年11月26日 14:34:53   作者:m0_38025927  
这篇文章主要为大家详细介绍了java数据结构实现双向链表功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

双向链表实现

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点后继结点

注意:在操作双向链表时,不要去移动指向前驱节点和后继节点的指针,而是重新定义指向头尾的指针进行移动。*

环境

IDEA

自定义操作接口

双向链表。

public interface MyList<E> {
    void add(E node);
    E get(int index);
    E remove(int index);
    int size();
}

实现类

public class MyDoublyLinkList<E> implements MyList<E> {

    /**
     * 定义双向链表节点
     */
    class Node<E> {
        Node<E> prev;
        E item;
        Node<E> next;

        public Node(Node<E> prev, E item, Node<E> next) {
            this.prev = prev;
            this.item = item;
            this.next = next;
        }
    }

    private Node<E> head;
    private Node<E> tail;
    private int size;

    /**
     * 将节点添加到尾部
     *
     * @param item
     * @return
     */
    @Override
    public void add(E item) {
        this.linkLast(item);
    }

    /**
     * 添加一个元素到尾部
     *
     * @param e
     */
    private void linkLast(E e) {
        //获取tail
        Node<E> node = this.tail;
        //创建一个node
        Node<E> newNode = new Node<>(node, e, null);
        this.tail = newNode;
        if (node == null)
            this.head = newNode;
        else
            node.next = newNode;
        size++;
    }

    /**
     * 获取指定位置元素
     * @param index
     * @return
     */

    @Override
    public E get(int index) {
        //校验index是否合法
        checkIndex(index);
        //获取index元素
        return getNode(index).item;
    }

    /**
     * 校验index合法性
     *
     * @param index
     */
    private void checkIndex(int index) {
        if (!(index >= 0 && index < this.size))
            throw new IndexOutOfBoundsException(String.format("index out of bounds,index:%s,size:%s", index, this.size));
    }

    /**
     * 获取node
     *
     * @param index
     * @return
     */
    private Node<E> getNode(int index) {
        if (index > (size >> 1)) {
            Node<E> node = this.tail;
            //从tail向前遍历
            for (int i = size - 1; i > index; i--) {
                node = node.prev;
            }
            return node;
        } else {
            //从head向后遍历
            Node<E> node = this.head;
            for (int i = 0; i < index; i++) {
                node = node.next;
            }
            return node;
        }
    }

    /**
     * 删除指定位置元素
     *
     * @param index
     * @return
     */
    @Override
    public E remove(int index) {
        //判断index合法性
        this.checkIndex(index);
        Node<E> node = getNode(index);
        E e = node.item;
        //判断是否为头节点
        if (node.prev == null) {
            this.head = node.next;
        } else {
            node.prev.next = node.next;
            node.prev = null;
        }
        //判断是否为尾节点
        if (node.next == null) {
            this.tail = node.next;
        } else {
            node.next.prev = node.prev;
            node.next = null;
        }
        node.item = null;
        size--;
        return e;
    }

    /**
     * 获取链表长度
     *
     * @return
     */
    @Override
    public int size() {
        return this.size;
    }
}

测试方法

public static void main(String[] args) {
        MyList<String> stringMyList = new MyDoublyLinkList<>();
        System.out.println(stringMyList.size());
        stringMyList.add("a");
        stringMyList.add("b");
        stringMyList.add("c");
        stringMyList.add("d");
        System.out.println(stringMyList.size());
        String re = stringMyList.remove(1);
        System.out.println(re);
        for (int i = 0; i < stringMyList.size(); i++) {
            System.out.println(stringMyList.get(i));
        }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot3.3中实现多端口监听的示例代码

    SpringBoot3.3中实现多端口监听的示例代码

    在SpringBoot应用中实现多端口监听,可以让一个应用处理不同类型的HTTP请求或暴露多个服务接口,本文详细讲解了通过配置application.yml文件和编写自定义配置类的方法,实现了对多个端口的监听,感兴趣的可以了解一下
    2024-11-11
  • 带你了解Java常用类小结

    带你了解Java常用类小结

    今天带大家学习Java常用工具类,文中有非常详细的图文解说及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • Idea集成ApiFox插件及使用小结

    Idea集成ApiFox插件及使用小结

    本文介绍了如何使用Apifox和IntelliJ IDEA插件来整理和生成接口文档,包括配置Apifox和IntelliJ IDEA插件、代码案例以及使用方法,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    这篇文章主要介绍了hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法,需要的朋友可以参考下
    2017-09-09
  • JAVA使用动态代理对象进行敏感字过滤代码实例

    JAVA使用动态代理对象进行敏感字过滤代码实例

    这篇文章主要介绍了JAVA使用动态代理对象进行敏感字过滤代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot2底层注解@Import用法详解

    SpringBoot2底层注解@Import用法详解

    这篇文章主要为大家介绍了SpringBoot2底层注解@Import用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 使用JPA中@Query 注解实现update 操作方法(必看)

    使用JPA中@Query 注解实现update 操作方法(必看)

    下面小编就为大家带来一篇使用JPA中@Query 注解实现update 操作方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring boot实现热部署的两种方式详解

    Spring boot实现热部署的两种方式详解

    这篇文章主要介绍了Spring boot实现热部署的两种方式,这两种方法分别是使用 Spring Loaded和使用spring-boot-devtools进行热部署,文中给出了详细示例代码和介绍,需要的朋友可以参考学习,下面来一起看看吧。
    2017-04-04
  • Java并发编程示例(二):获取和设置线程信息

    Java并发编程示例(二):获取和设置线程信息

    这篇文章主要介绍了Java并发编程示例(二):获取和设置线程信息,本文是系列文章的第二篇,本文着重讲解Thread类的几个重要属性,需要的朋友可以参考下
    2014-12-12
  • springcloud feign集成hystrix方式

    springcloud feign集成hystrix方式

    这篇文章主要介绍了springcloud feign集成hystrix方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论