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日

相关文章

  • C语言基础 strlen 函数

    C语言基础 strlen 函数 简介 strlen函数是C语言中非常常用的字符串函数之一,用于计算一个字符串的长度。其原型为: size_t strlen(const char *str); 函数原型的返回值类型为 size_t, size_t 是一个无符号整数类型,其大小通常与 unsigned int 相同,用于保证变量的值为正数。函数的参数是一个指向字…

    other 2023年6月27日
    00
  • 路由器怎么关闭定时重启功能? 路由器定时重启手动关闭的方法

    要关闭路由器的定时重启功能,通常需要进入路由器的管理界面进行设置。具体操作步骤如下: 连接路由器 首先,在电脑上打开浏览器,输入 http://192.168.1.1 或 http://192.168.0.1,进入路由器的管理界面。如果上述地址无法进入,可以尝试查看路由器说明书中给出的默认地址。 登录路由器 在管理界面上输入用户名和密码登录路由器。一般情况下…

    other 2023年6月27日
    00
  • 0基础入门学习Python(第3章)

    下面是关于0基础入门学习Python第3章的完整攻略,包括环境搭建、代码编写和两个示例说明。 环境搭建 下载安装Python: 首先,需要从Python官网下载并安装Python。安装过程中,选择添加Python到系统环境变量。 安装IDE: 可以选择安装PyCharm或者其他Python IDE,用于编写和运行Python代码。 代码编写 变量: 在Pyt…

    other 2023年5月6日
    00
  • jquery控制元素显示、隐藏、切换、滑动的方法

    以下是jQuery控制元素显示、隐藏、切换、滑动的完整攻略,包括以下内容: 概述 控制元素显示、隐藏的方法 控制元素切换的方法 控制元素滑动的方法 示例说明 1. 概述 在jQuery中,可以使用一些方法来控制元素的显示、隐藏、切换、滑动等效果。这些方法可以帮助用户实现更灵活的页面交互效果。本文将介绍jQuery中控制元素显示、隐藏、切换、滑动的方法。 2.…

    other 2023年5月9日
    00
  • ASP.NET MVC4入门教程(七):给电影表和模型添加新字段

    针对这个话题,我将为你详细讲解如何在ASP.NET MVC4中给电影表和模型添加新字段。 第一步:添加新字段到电影模型类中 首先,我们需要在我们的电影模型(Movie.cs)中添加新字段,以此来存储电影的“导演”信息。我们可以在模型类中添加如下代码: public string Director { get; set; } 这样,我们的电影模型类就多了一个名…

    other 2023年6月25日
    00
  • SpringBoot中的HATEOAS详情

    下面给您详细讲解 Spring Boot 中的 HATEOAS 详情的攻略。 什么是 HATEOAS? HATEOAS 是 Hypertext As The Engine Of Application State 的缩写,即“超媒体作为应用程序状态引擎”。 简单来说,HATEOAS 是为 RESTful API 设计的一种规范,它允许客户端在与服务器进行通信…

    other 2023年6月26日
    00
  • Java深入讲解Bean作用域与生命周期

    Java深入讲解Bean作用域与生命周期 什么是Bean? 在这里,我们先简单介绍下什么是Bean。Bean是Java语言里可重用组件的标准(POJO),其是Java反射机制的实例。换句话说,Bean就是一个Java对象。Bean拥有一个唯一的ID,以及若干属性。 Bean的作用域 Bean的作用域决定了Bean对象的生命周期和访问权限。 在Spring中,…

    other 2023年6月27日
    00
  • Android中ViewPager的PagerTabStrip与PagerTitleStrip用法实例

    Android中ViewPager的PagerTabStrip与PagerTitleStrip用法实例 ViewPager是Android中常用的布局容器,用于实现滑动切换不同的页面。PagerTabStrip和PagerTitleStrip是ViewPager的两个常用子类,用于显示页面标题和提供导航功能。本攻略将详细介绍PagerTabStrip和Pag…

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