java代码实现双向链表

下面我为大家详细讲解如何使用Java代码实现双向链表。

什么是双向链表?

双向链表是一种数据结构,与单向链表类似,但其每个节点还会连接到其前驱节点。一个节点包括数据域和两个指针域,分别指向前后两个节点。可以看做是两个单向链表的结合体。

双向链表的实现

1. 定义节点类

Java代码中,需要先定义一个节点类来表示链表中的每个节点。Java代码实现如下:

public class ListNode {
    int val;
    ListNode prev;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.prev = null;
        this.next = null;
    }
}

ListNode表示一个节点,包含val表示节点存储的值,prev表示前一个节点,next表示后一个节点。我们使用构造函数来初始化这些值。

2. 实现双向链表类

接下来,实现双向链表类,包含添加节点、删除节点、输出链表等基本操作。Java代码实现如下:

public class DoublyLinkedList {
    private ListNode head;
    private ListNode tail;
    private int size;

    public DoublyLinkedList() {
        this.head = null;
        this.tail = null;
        this.size = 0;
    }

    public void addFirst(int val) {
        ListNode node = new ListNode(val);
        if (head == null) {
            head = tail = node;
        } else {
            node.next = head;
            head.prev = node;
            head = node;
        }
        size++;
    }

    public void addLast(int val) {
        ListNode node = new ListNode(val);
        if (tail == null) {
            head = tail = node;
        } else {
            tail.next = node;
            node.prev = tail;
            tail = node;
        }
        size++;
    }

    public void addAtIndex(int index, int val) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("Invalid index");
        } else if (index == 0) {
            addFirst(val);
        } else if (index == size) {
            addLast(val);
        } else {
            ListNode node = new ListNode(val);
            ListNode cur = getNodeAtIndex(index);
            ListNode prev = cur.prev;
            prev.next = node;
            node.prev = prev;
            node.next = cur;
            cur.prev = node;
            size++;
        }
    }

    public ListNode getNodeAtIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Invalid index");
        }
        ListNode cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur;
    }

    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Invalid index");
        }
        ListNode cur = getNodeAtIndex(index);
        ListNode prev = cur.prev;
        ListNode next = cur.next;
        if (prev == null) {
            head = next;
        } else {
            prev.next = next;
        }
        if (next == null) {
            tail = prev;
        } else {
            next.prev = prev;
        }
        size--;
    }

    public void printList() {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }
}

DoublyLinkedList表示双向链表类,包含头指针head、尾指针tail和链表节点个数size,下面介绍一下几个核心方法。

  • addFirst方法:在链表头部添加节点。
  • addLast方法:在链表尾部添加节点。
  • addAtIndex方法:在链表的index位置添加节点,如果index位置越界,则抛出异常。
  • deleteAtIndex方法:删除链表中index位置的节点,如果index位置越界,则抛出异常。
  • getNodeAtIndex方法:获取链表中index位置的节点。
  • printList方法:输出链表中所有节点的值。

这样,我们就实现了一个双向链表类。

3. 示例

下面通过两个示例说明如何使用我们刚刚实现的双向链表。

示例1:在双向链表中添加节点

public static void main(String[] args) {
    DoublyLinkedList list = new DoublyLinkedList();
    list.addFirst(1);
    list.addLast(3);
    list.addAtIndex(1, 2);
    list.printList();
    // 输出结果:1 2 3
}

在示例中,首先创建了一个双向链表对象list,然后在链表头部添加节点1,接着在链表尾部添加节点3,最后在链表的第二个位置插入节点2,然后输出完整的链表节点值。

示例2:在双向链表中删除节点

public static void main(String[] args) {
    DoublyLinkedList list = new DoublyLinkedList();
    list.addFirst(1);
    list.addLast(2);
    list.addLast(3);
    list.deleteAtIndex(1);
    list.printList();
    // 输出结果:1 3
}

在示例中,首先创建了一个双向链表对象list,然后在链表头部添加节点1,接着在链表尾部添加节点2和节点3,之后删除了第二个节点,并输出完整的链表节点值。

总结

以上就是Java代码实现双向链表的完整攻略了。双向链表和单向链表主要区别在于节点除了保存指向下一个节点的指针外,还保存指向上一个节点的指针。通过使用Java代码,我们可以轻松地创建和操作双向链表,实现常见的链表操作,如添加节点、删除节点等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java代码实现双向链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vue3中的hook简单封装

    下面是关于“vue3中的hook简单封装”的完整攻略: 一、Vue3中的Hook 在Vue3中,我们可以使用三种类型的Hook: Setup Hook:这是Vue3中的重要新增特性,我们可以在这个函数中进行组件的初始化,并且可以访问到组件的props、data、methods等属性和方法。 Lifecycle Hook:这些Hook会在组件的生命周期内自动被…

    other 2023年6月25日
    00
  • 支持向量机多分类matlab

    支持向量机多分类matlab 简介 支持向量机(Support Vector Machine, SVM)是一种广泛应用于分类、回归和离群点检测的机器学习算法。其优点在于可以有效地处理高维空间中的复杂数据,具有较高的分类准确度和泛化能力。本文将介绍如何在MATLAB中使用SVM进行多分类问题的建模和训练。 数据准备 在进行SVM多分类的建模和训练前,我们需要准…

    其他 2023年3月28日
    00
  • 浅谈软件工程师的自我修养

    浅谈软件工程师的自我修养攻略 简介 软件工程师的自我修养是提升个人技能和职业素养的重要方面。通过不断学习和实践,软件工程师可以不断提高自己的技术水平和解决问题的能力。本攻略将介绍一些提升软件工程师自我修养的方法和建议。 1. 持续学习 软件工程领域的技术更新迅速,持续学习是软件工程师保持竞争力的关键。以下是一些学习的方法和示例: 阅读技术书籍和文档:选择与自…

    other 2023年7月27日
    00
  • Git 常用命令整理

    Git 常用命令整理 1. Git 工作流程 Git 是一款分布式版本控制系统,采用的是以提交为基础的工作流程。当我们在项目中添加、修改和删除文件时,我们会将这些修改提交到本地 Git 仓库中。随后,通过 push 操作,将本地提交推送到远程 Git 仓库中。 2. Git 常用命令 2.1. 创建本地仓库 在本地创建一个新的 Git 仓库 $ git in…

    other 2023年6月26日
    00
  • okhttp工具类

    OkHttp工具类的完整攻略 OkHttp是一个流行的Java HTTP客户端,用于发送和接收HTTP请求和响应。它提供了简单用的API,持同和异步请求,以及HTTP/2和WebSocket。在使用OkHttp时,我们可以编写一个具类,以更好地管理和用OkHttp户端。本文将提供一个完整的攻略,帮助您编写OkHttp工具类。 1. 添加OkHttp依赖 首先…

    other 2023年5月8日
    00
  • Hello world!让 grub2 引导自己的操作系统 Xos 内核

    Hello world!让 grub2 引导自己的操作系统 Xos 内核 背景 在编写操作系统或内核的过程中,我们需要选择一个好的引导方式。grub2 是一个被广泛使用的引导程序,能够方便地引导多种操作系统,包括自己的操作系统。 步骤 准备工作 在开始之前,需要先安装 grub2 引导程序以及将编译好的 Xos 内核准备好。在 Ubuntu 上可以使用以下命…

    其他 2023年3月28日
    00
  • bmob—移动后端云服务平台

    bmob—移动后端云服务平台 移动互联网已经成为当今社会的主流。越来越多的企业和个人开始开发移动应用,而一个好的应用需要有一个稳定可靠、高扩展性的后端服务支撑。这时,就需要一个好的云服务平台来满足这些需求。 bmob是国内领先的移动后端云服务平台,提供了从数据存储、推送服务到即时通讯服务、物联网平台等全方位的移动后端云服务支撑。bmob所提供的服务简单易用,…

    其他 2023年3月28日
    00
  • bootstrap框架菜鸟入门教程

    Bootstrap框架菜鸟入门教程 Bootstrap是一款非常流行的前端开发框架,它可以帮助你快速构建美观、响应式的网站界面。下面是一份针对Bootstrap菜鸟的入门教程,帮助你快速了解Bootstrap框架。 什么是Bootstrap框架 Bootstrap是一个由Twitter开源的、基于HTML/CSS/JavaScript的前端框架。Bootst…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部