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

yizhihongxing

下面是详细讲解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日

相关文章

  • IIS配置文件的XML格式不正确 applicationHost.config被破坏 恢复解决办法

    问题描述: 当使用Internet Information Services(IIS)版本7或更高版本时,有时会出现以下错误消息: “IIS配置文件的XML格式不正确 applicationHost.config被破坏” 这种情况通常意味着IIS配置文件已经损坏或遭到破坏,需要进行修复或恢复。 解决方法: 以下是修复IIS配置文件的步骤: 安装IIS Man…

    other 2023年6月25日
    00
  • 详解C++中对构造函数和赋值运算符的复制和移动操作

    以下是详解C++中对构造函数和赋值运算符的复制和移动操作的完整攻略: 1. 构造函数的复制和移动操作 复制构造函数 当我们定义一个新的对象并且使用已经存在的对象进行初始化时,复制构造函数就会被调用。复制构造函数的定义格式如下: class MyClass { public: MyClass(); // 默认构造函数 MyClass(const MyClass…

    other 2023年6月26日
    00
  • JQuery操作三大控件(下拉,单选,复选)的方法

    JQuery是一种流行的JavaScript库,提供了丰富的API和方法来简化JavaScript编程。在Web开发中,下拉框、单选框和复选框是非常常见的控件,JQuery提供了方便的方法来操作这些控件。以下是“JQuery操作三大控件(下拉,单选,复选)的方法”完整攻略: 操作下拉框 获取下拉框选中的值 可以使用 .val() 方法获取下拉框当前选中的值。…

    other 2023年6月27日
    00
  • 微信小程序全局变量的设置、使用、修改过程解析

    微信小程序全局变量的设置、使用、修改过程解析 微信小程序提供了全局变量的设置、使用和修改功能,使得开发者可以在不同页面之间共享数据。下面是详细的攻略: 设置全局变量 要设置全局变量,可以使用getApp()方法获取小程序实例,并在实例上定义全局变量。在app.js文件中,可以使用App()函数来定义小程序实例,并在其中设置全局变量。 // app.js Ap…

    other 2023年7月29日
    00
  • Win11操作系统无缝支持安卓 App 界面大更新

    Win11操作系统无缝支持安卓App的更新是一个非常受人关注的功能,下面我们来详细讲解这个更新的完整攻略和具体使用方法。 支持安卓 App 的前提条件 在使用Win11无缝支持安卓App之前,需要满足以下几个前提条件: 前往微软商店下载安装”Your Phone”应用并打开,在手机上下载并安装”Your Phone Companion”应用,并进行一次连接确…

    other 2023年6月26日
    00
  • uniapp-富文本编辑器editor(仅支持app和微信小程序)

    以下是关于uniapp富文本编辑器editor的完整攻略,包括编辑器的定义、使用方法、示例说明和注意事项。 编辑器的定义 uniapp富文本编辑器editor是一款专门为app和微信小程序开发的富文本编辑器,可以帮助开发者快速实现富文本编辑功能。编辑器支持多种文本格式、图片、视频、音频等多种媒体类型的插入和编辑。 使用方法 以下是使用uniapp富文本编辑器…

    other 2023年5月8日
    00
  • jquery 触发/失去焦点事件例子详解

    jQuery触发/失去焦点事件例子详解 在Web开发中,我们经常需要使用JavaScript来控制页面元素的交互,其中事件是最关键的一环。通过事件可以实现用户与页面的交互反馈,从而提高用户体验。本文将详细介绍jQuery中触发/失去焦点事件的例子,并且给出详细的代码实现。 什么是触发/失去焦点事件? 当一个元素被选中时,称之为”获得焦点”。相反,当元素从选中…

    其他 2023年3月28日
    00
  • C++移动语义详细介绍使用

    C++移动语义详细介绍使用 什么是移动语义 C++11引入移动语义的主要目的是为了提高代码的效率。传统的C++使用拷贝构造函数深拷贝的方式实现对象传递,对于大量数据的传递效率非常低下。而移动语义则是通过移动资源的方式来实现对象传递,不需要进行不必要的复制操作,从而提高效率。 C++11中规定,如果一个对象的资源可以被移动,那么这个对象就是可移动的。 如何使用…

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