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));
        }
    }

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

相关文章

  • 关于@Configuration的作用说明

    关于@Configuration的作用说明

    这篇文章主要介绍了关于@Configuration的作用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • JWT令牌的工作原理详解

    JWT令牌的工作原理详解

    这篇文章主要介绍了JWT令牌的工作原理详解,在认证的时候,当用户用他们的的凭证成功登录以后,一个JSON Web Token将会被返回,此后,用户名和密码就不再是用户的凭证,而token是用户用来访问资源的新凭证了,需要的朋友可以参考下
    2023-08-08
  • 关于springcloud报错报UnsatisfiedDependencyException的问题

    关于springcloud报错报UnsatisfiedDependencyException的问题

    这篇文章主要介绍了关于springcloud报错报UnsatisfiedDependencyException的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java接口名称冲突问题的讲解

    Java接口名称冲突问题的讲解

    今天小编就为大家分享一篇关于Java接口名称冲突问题的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 列举java语言中反射的常用方法及实例代码

    列举java语言中反射的常用方法及实例代码

    反射机制指的是程序在运行时能够获取自身的信息。这篇文章主要介绍了列举java语言中反射的常用方法,需要的朋友可以参考下
    2019-07-07
  • SpringBoot的@Value注解如何设置默认值

    SpringBoot的@Value注解如何设置默认值

    这篇文章主要介绍了SpringBoot的@Value注解如何设置默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • springboot实现以代码的方式配置sharding-jdbc水平分表

    springboot实现以代码的方式配置sharding-jdbc水平分表

    这篇文章主要介绍了springboot实现以代码的方式配置sharding-jdbc水平分表,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java NIO深入分析

    Java NIO深入分析

    本篇技术文章主要对Java新api(New IO)做了详细深入的讲解,有助于程序对NIO有更加深入的理解。
    2017-12-12
  • Java中Arrays的介绍及使用方法示例

    Java中Arrays的介绍及使用方法示例

    这篇文章主要给大家介绍了关于Java中Arrays及使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java synchronized用法详解

    java synchronized用法详解

    本篇文章主要介绍了java synchronized用法详解,synchronized是Java中的关键字,是一种同步锁。有兴趣的同学可以了解一下。
    2016-11-11

最新评论