Java如何实现双向链表功能

 更新时间:2021年11月26日 09:50:12   作者:m0_38025927  
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

双向链表实现

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。注意:在操作双向链表时,不要去移动指向前驱节点和后继节点的指针,而是重新定义指向头尾的指针进行移动。*

环境

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

到此这篇关于Java如何实现双向链表功能的文章就介绍到这了,更多相关Java 双向链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中String.format的使用方法总结

    Java中String.format的使用方法总结

    这篇文章主要介绍了Java中String.format的用法总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java基于PDFbox实现读取处理PDF文件

    Java基于PDFbox实现读取处理PDF文件

    PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。本文将具体介绍一下PDFbox读取处理PDF文件的示例代码,感兴趣的可以学习一下
    2022-02-02
  • SpringBoot+MyBatis简单数据访问应用的实例代码

    SpringBoot+MyBatis简单数据访问应用的实例代码

    这篇文章主要介绍了SpringBoot+MyBatis简单数据访问应用的实例代码,需要的朋友可以参考下
    2017-05-05
  • Java spring boot发送邮箱实现过程记录

    Java spring boot发送邮箱实现过程记录

    我们在⽹站上注册账号的时候⼀般需要获取验证码,⽽这个验证码⼀般发送在你的⼿机号上还有的是发送在你的邮箱中,这篇文章主要给大家介绍了关于Java spring boot发送邮箱实现的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java中的二维数组的赋值与输出方式

    Java中的二维数组的赋值与输出方式

    这篇文章主要介绍了Java中的二维数组的赋值与输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • SpringBoot 整合数据源的具体实践

    SpringBoot 整合数据源的具体实践

    本文主要介绍了SpringBoot 整合数据源的具体实践,利用 Spring Boot 的自动配置和简化的注解来简化数据源配置工作,从而更专注于应用程序的业务逻辑开发,感兴趣的可以了解一下
    2023-11-11
  • Canal搭建 idea设置及采集数据到kafka的操作方法

    Canal搭建 idea设置及采集数据到kafka的操作方法

    这篇文章主要介绍了Canal搭建idea设置及采集数据到kafka的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • springcloud gateway如何实现路由和负载均衡

    springcloud gateway如何实现路由和负载均衡

    这篇文章主要介绍了springcloud gateway如何实现路由和负载均衡的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Springboot启动停止命令的.sh脚本编写方式

    Springboot启动停止命令的.sh脚本编写方式

    这篇文章主要介绍了Springboot启动停止命令的.sh脚本编写方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 解决Error:Java:无效的源发行版:14问题

    解决Error:Java:无效的源发行版:14问题

    在项目开发中,版本不一致常见问题,首先,应检查本地JDK版本,使用命令java-version,其次,核对项目及模块版本,若有不一致,通过修改pom.xml文件同步版本,重新下载依赖即可解决问题,这种方法简单有效,适用于多种开发环境
    2024-10-10

最新评论