Java实现双向链表(两个版本)

下面是详细讲解Java实现双向链表的完整攻略。

双向链表定义

双向链表是链表的一种,每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。相对于单向链表,双向链表可以实现双向遍历,但是占用空间较大。

双向链表的实现

版本一

双向链表的每个节点需要维护前向指针和后向指针,因此我们可以定义一个Node类来封装节点信息,再定义一个双向链表类来封装链表信息。

Node类定义如下:

class Node {
    int data;
    Node prev;
    Node next;

    public Node(int data) {
        this.data = data;
        this.prev = null;
        this.next = null;
    }
}

双向链表类定义如下:

class DoubleLinkedList {
    Node head;
    Node tail;

    public DoubleLinkedList() {
        this.head = null;
        this.tail = null;
    }

    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            tail = newNode;
        } else {
            tail.next = newNode;
            newNode.prev = tail;
            tail = newNode;
        }
    }

    public void printFromHead() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }

    public void printFromTail() {
        Node current = tail;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.prev;
        }
        System.out.println();
    }
}

这里定义了头节点和尾节点两个指针,add方法用于向链表中添加新节点,printFromHead和printFromTail方法用于从头节点和尾节点打印链表。

示例一:

DoubleLinkedList list = new DoubleLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.printFromHead(); // 1 2 3
list.printFromTail(); // 3 2 1

版本二

在版本一的实现中,我们每次在尾节点添加新节点时需要遍历整个链表,因此时间复杂度较高。我们可以在链表类中添加一个变量count,用于记录链表节点的数量,然后在添加新节点时直接将其插入到尾节点之后,省去了遍历的过程。

双向链表类定义如下:

class DoubleLinkedList {
    Node head;
    Node tail;
    int count;

    public DoubleLinkedList() {
        this.head = null;
        this.tail = null;
        this.count = 0;
    }

    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            tail = newNode;
        } else {
            tail.next = newNode;
            newNode.prev = tail;
            tail = newNode;
        }
        count++;
    }

    public void printFromHead() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }

    public void printFromTail() {
        Node current = tail;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.prev;
        }
        System.out.println();
    }
}

示例二:

DoubleLinkedList list = new DoubleLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.printFromHead(); // 1 2 3
list.printFromTail(); // 3 2 1

总结

双向链表是一种非常常用的数据结构,在实际开发中也经常用到。上述是两种Java实现双向链表的方法,考虑实际情况和需求选择适合自己的实现方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现双向链表(两个版本) - Python技术站

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

相关文章

  • springboot + vue 实现递归生成多级菜单(实例代码)

    下面我将为您详细讲解“springboot + vue 实现递归生成多级菜单”的完整攻略。 简介 本文将介绍如何使用SpringBoot和Vue.js实现递归生成多级菜单。通过该方案,可以生成任意深度的多级菜单。 准备工作 在开始之前,需要下载安装以下软件: JDK 8+ Node.js Vue CLI 创建SpringBoot项目 首先,使用Spring …

    other 2023年6月27日
    00
  • 关于vim:在vi中执行查找替换确认时如何返回上一步?

    关于vim:在vi中执行查找替换确认时如何返回上一步? 在vim中执行查找替换确认时,如果需要返回一步,可以使用u命令撤销上一步操作。下面是详细的攻略和两个示例说明: 步骤 执行查找替换命令:在vim中,可以使用:%s/old/new/gc命令执行查找替换操作。其中,%表示对整个文件进行操作,s表示替换操作,old表示要替换字符串,new表示替换后的字符串,…

    other 2023年5月7日
    00
  • unix操作系统

    Unix操作系统攻略 Unix操作系统是一种多用户、多任务、支持多种编程语言的操作系统。在Unix系统中,所有的硬件设备、文件和进程都是以文件形式存在的,Unix系统提供了强大、灵活的命令行界面,使得用户可以方便地进行各种复杂的操作。 基本命令 1. 文件操作命令 以下是Unix系统中最基本的文件操作命令: ls 用于列出当前目录下的所有文件和子目录。 cd…

    其他 2023年4月16日
    00
  • vue实现下拉加载其实没那么复杂

    下面我将为您详细讲解“Vue实现下拉加载其实没那么复杂”的完整攻略。 1. 实现思路 实现下拉加载的思路比较简单,主要是利用vue的组件化和axios的数据请求。首先创建一个可滚动加载的组件,在其生命周期中利用axios请求数据并更新到组件的显示列表中,当滚动到底部时再次触发axios请求数据,重复更新从而实现下拉加载。 2. 实现步骤 2.1 创建可滚动加…

    other 2023年6月25日
    00
  • Win10一周年更新预览版14393推送累计更新补丁KB3176934

    Win10一周年更新预览版14393推送累计更新补丁KB3176934攻略 简介 Win10一周年更新预览版14393是Windows 10操作系统的一个重要更新版本。推送的累计更新补丁KB3176934是为了修复一些已知问题和提升系统性能而发布的。本攻略将详细介绍如何安装和应用该补丁。 步骤 步骤一:检查系统版本 首先,确保你的系统版本是Win10一周年更…

    other 2023年8月3日
    00
  • 浅析Python面向对象编程

    浅析Python面向对象编程 什么是面向对象编程 面向对象编程(Object Oriented Programming, OOP) 是一种程序设计的思想方式,是以对象为基础来构建程序的编程范式。 在面向对象编程中,一切程序实体都是对象,对象之间通过消息传递进行交互。每个对象都是一个可以执行任务、处理数据的独立体,由一个或多个方法构成。方法是属于对象的,只有该…

    other 2023年6月27日
    00
  • vue开发项目详细教程(第一篇搭建环境篇)

    Vue开发项目详细教程(第一篇搭建环境篇) Vue是一款非常流行的前端框架,能够帮助开发者快速构建响应式、高效、灵活的Web应用程序。本文将为大家介绍如何搭建Vue开发环境,为后续的Vue项目开发做好准备。 1. 安装Node.js 在开始搭建Vue开发环境之前,需要先安装Node.js。Node.js是基于Chrome V8引擎的JavaScript运行环…

    其他 2023年3月28日
    00
  • 查看Python依赖包及其版本号信息的方法

    当你在Python项目中使用依赖包时,了解其版本号信息是非常重要的。下面是查看Python依赖包及其版本号信息的方法的完整攻略: 使用pip命令查看已安装的依赖包及其版本号信息: 在命令行中输入以下命令可以查看已安装的Python依赖包及其版本号信息: pip list 这将列出所有已安装的依赖包及其对应的版本号。 示例说明: “` $ pip list …

    other 2023年8月3日
    00
合作推广
合作推广
分享本页
返回顶部