Java实现双链表的示例代码

下面我将为您详细讲解Java实现双链表的示例代码的完整攻略。

什么是双链表

双链表是一种常见的数据结构,在链表中每个节点中都存储了前驱节点和后继节点的地址。与单链表相比,双链表能够更快速地进行双向遍历,但是需要更多的空间来存储节点的前驱和后继节点地址。

Java实现双链表的步骤

下面是实现双链表的步骤:

  1. 定义节点类,该节点类应该包含前驱节点和后继节点的引用。

  2. 定义双链表类,该类中应该包含头节点和尾节点的引用。

  3. 定义添加节点的方法,该方法应该在双链表末尾添加节点。

  4. 定义删除节点的方法,该方法应该根据节点的值在双链表中删除指定节点。

  5. 定义遍历节点的方法,该方法应该可以实现正向和反向遍历。

下面我们将按照上述步骤逐步实现Java双链表的示例代码。

  1. 定义节点类
public class DoublyLinkedListNode<T> {
    public T value;
    public DoublyLinkedListNode<T> prev;
    public DoublyLinkedListNode<T> next;

    public DoublyLinkedListNode(T value) {
        this.value = value;
        this.prev = null;
        this.next = null;
    }
}

节点类包含一个泛型的值,以及前驱节点和后继节点的引用。

  1. 定义双链表类
public class DoublyLinkedList<T> {
    public DoublyLinkedListNode<T> head;
    public DoublyLinkedListNode<T> tail;

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

    public void add(T value) {
        DoublyLinkedListNode<T> node = new DoublyLinkedListNode<>(value);

        if (this.head == null) {
            this.head = node;
        } else {
            this.tail.next = node;
            node.prev = this.tail;
        }

        this.tail = node;
    }

    public void delete(T value) {
        DoublyLinkedListNode<T> current = this.head;

        while (current != null) {
            if (current.value.equals(value)) {
                if (current.prev != null) {
                    current.prev.next = current.next;
                } else {
                    this.head = current.next;
                }

                if (current.next != null) {
                    current.next.prev = current.prev;
                } else {
                    this.tail = current.prev;
                }
            }

            current = current.next;
        }
    }

    public void traverse(boolean reverse) {
        DoublyLinkedListNode<T> current = reverse ? this.tail : this.head;

        while (current != null) {
            System.out.println(current.value);
            current = reverse ? current.prev : current.next;
        }
    }
}

双链表类包含头节点和尾节点的引用。该类中定义了添加节点、删除节点和遍历节点的方法。其中,添加节点的方法将节点添加到链表末尾,删除节点的方法会根据节点的值删除指定的节点,而遍历节点的方法可以实现正向和反向遍历。

  1. 测试示例1
DoublyLinkedList<Integer> list = new DoublyLinkedList<>();
list.add(1);
list.add(2);
list.add(3);

list.traverse(false);  // 正向遍历,输出1、2、3

上述代码创建了一个双链表,并在其中分别添加了值为1、2、3的节点,然后正向遍历双链表并输出节点的值。

  1. 测试示例2
DoublyLinkedList<String> list = new DoublyLinkedList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");

list.delete("b");

list.traverse(true);   // 反向遍历,输出d、c、a

上述代码创建了一个双链表,并在其中添加了值为"a"、"b"、"c"、"d"的节点,然后删除了节点值为"b"的节点,并反向遍历双链表并输出节点的值。

至此,我们已经完成了Java实现双链表的示例代码。

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

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

相关文章

  • mac平台下部署ue4工程到ios设备的流程

    以下是在Mac平台下部署UE4工程到iOS设备的完整攻略,包含两个示例说明: 步骤1:安装必要的软件 在Mac平台上部署UE4工程到iOS设备之前,需要安装以下软件: Xcode:用于编译iOS应用程序。 Unreal Engine 4:用于创建和编辑UE4工程。 iOS设备驱动程序:用于将iOS设备连接到Mac电脑。 步骤2:设置UE4工程 在UE4中设置…

    other 2023年5月9日
    00
  • JavaScript中 创建动态 QML 对象的方法

    以下是使用标准的Markdown格式文本,详细讲解JavaScript中创建动态QML对象的方法的完整攻略: JavaScript中创建动态QML对象的方法 在JavaScript中,可以使用Qt的QML语言来创建动态对象。下面是两种常用的方法: 方法一:使用Qt.createQmlObject函数 可以使用Qt的createQmlObject函数来动态创建…

    other 2023年10月14日
    00
  • 通过案例了解静态修饰符static使用场景

    下面是“通过案例了解静态修饰符 static 使用场景”的攻略: 静态修饰符 static 的基本概念 在学习静态修饰符 static 的使用场景之前,我们需要先了解一下其基本概念。 静态修饰符 static 可以用来修饰类的成员变量和成员方法,被修饰的成员将会与类进行绑定而不是实例。这意味着,无论创建了多少实例,这些静态成员都只会存在一份,它们可以在整个类…

    other 2023年6月27日
    00
  • 大容量的U盘该选择哪一种文件系统格式比较好

    当我们选择U盘的文件系统格式时,应该考虑U盘的容量大小、使用场景、操作系统支持等因素。下面是选择U盘文件系统格式的完整攻略: 1.了解U盘的容量大小和使用场景 U盘的容量通常有8GB、16GB、32GB、64GB等不同规格。如果使用U盘作为文件传输的工具,通常需要存储大量的文件,特别是视频等大文件,因此需要选择支持大容量的文件系统格式。如果使用U盘做系统安装…

    other 2023年6月27日
    00
  • js利用递归与promise 按顺序请求数据的方法

    下面是详细讲解 “JS利用递归与Promise按顺序请求数据的方法” 的完整攻略。 一、什么是递归 递归是一种算法思想,它通过反复调用自身,将问题转化为一个或多个小的同类问题来求解。在JS中,递归通常被用来解决树形结构或嵌套结构数据遍历问题。下面是一个简单的递归示例: function countdown(num) { console.log(num); i…

    other 2023年6月27日
    00
  • Android 自定义RecyclerView 实现真正的Gallery效果

    Android 自定义RecyclerView 实现真正的Gallery效果 在Android开发中,我们经常会使用RecyclerView控件来创建列表,并且它的用法十分灵活,可以满足各种不同场景的需要。但是,在某些情况下,我们可能需要将RecyclerView的排版方式更改为横向滚动,实现类似于Gallery控件的效果。本文将介绍如何自定义Recycle…

    其他 2023年3月28日
    00
  • mkv2mp4formac(mkv转换mp4格式工具)

    以下是关于“mkv2mp4formac(mkv转换mp4格式工具)”的完整攻略,包括基本概念、使用方法和两个示例。 基本概念 mkv2mp4formac是一款Mac平台上的mkv转换mp4格式工具,可以将MKV格式的视频文件转换为MP4格式,以便在更多的设备上播放。它支持多种视频和音频编码格式,可以自定义输出视频和音频质量,还可以添加字幕和水印。 使用方法 …

    other 2023年5月7日
    00
  • 老毛子百度云文件名批量修改器给百度网盘文件批量重命名的方法介绍(附下载)

    那么我将为大家详细讲解“老毛子百度云文件名批量修改器给百度网盘文件批量重命名的方法介绍(附下载)”的完整攻略。 什么是老毛子百度云文件名批量修改器 老毛子百度云文件名批量修改器是一款专门针对百度网盘的文件批量重命名工具,它可以帮助用户快速地对百度网盘中的文件进行批量重命名,提高工作效率。 下载老毛子百度云文件名批量修改器 首先,我们需要下载老毛子百度云文件名…

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