Java实现双端链表LinkedList

Java实现双端链表LinkedList的完整攻略

双端链表LinkedList介绍

双端链表LinkedList是链表的一种,除了拥有节点指向下一个节点的指针外,还拥有指向上一个节点的指针,这样可以双向遍历链表。常用的操作包括插入、删除、获取和遍历。

实现步骤

1. 定义节点类

节点类用来表示链表的一个节点,包含节点的值(value)、下一个节点(next)、上一个节点(previous)。

public class Node<T> {
    T value;
    Node<T> next;
    Node<T> previous;

    public Node(T value) {
        this.value = value;
    }
}

2. 定义LinkedList类

LinkedList类包含链表的头节点(head)和尾节点(tail)以及链表的长度(size)。

public class LinkedList<T> {
    Node<T> head;
    Node<T> tail;
    int size;

    // 构造方法
    public LinkedList() {
        head = null;
        tail = null;
        size = 0;
    }

    // 判断链表是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    // 获取链表的长度
    public int size() {
        return size;
    }

    // 在链表头部插入节点
    public void addFirst(T value) {
        Node<T> newNode = new Node<T>(value);
        if (isEmpty()) {
            head = newNode;
            tail = head;
        } else {
            newNode.next = head;
            head.previous = newNode;
            head = newNode;
        }
        size++;
    }

    // 在链表尾部插入节点
    public void addLast(T value) {
        Node<T> newNode = new Node<T>(value);
        if (isEmpty()) {
            head = newNode;
            tail = head;
        } else {
            tail.next = newNode;
            newNode.previous = tail;
            tail = newNode;
        }
        size++;
    }

    // 删除链表头部节点
    public void removeFirst() {
        if (!isEmpty()) {
            if (head == tail) {
                head = null;
                tail = null;
            } else {
                head = head.next;
                head.previous = null;
            }
            size--;
        }
    }

    // 删除链表尾部节点
    public void removeLast() {
        if (!isEmpty()) {
            if (head == tail) {
                head = null;
                tail = null;
            } else {
                tail = tail.previous;
                tail.next = null;
            }
            size--;
        }
    }

    // 获取链表头部节点的值
    public T getFirst() {
        if (!isEmpty()) {
            return head.value;
        } else {
            return null;
        }
    }

    // 获取链表尾部节点的值
    public T getLast() {
        if (!isEmpty()) {
            return tail.value;
        } else {
            return null;
        }
    }

    // 遍历链表
    public void traverse() {
        if (!isEmpty()) {
            Node<T> current = head;
            while (current != null) {
                System.out.print(current.value + " ");
                current = current.next;
            }
            System.out.println();
        }
    }
}

示例说明

示例一

public static void main(String[] args) {
    LinkedList<Integer> linkedList = new LinkedList<Integer>();
    linkedList.addFirst(1);
    linkedList.addLast(2);
    linkedList.addFirst(3);
    linkedList.traverse(); // 输出 3 1 2
    linkedList.removeFirst();
    linkedList.traverse(); // 输出 1 2
    linkedList.removeLast();
    linkedList.traverse(); // 输出 1
    System.out.println(linkedList.getFirst()); // 输出 1
    System.out.println(linkedList.getLast()); // 输出 1
    System.out.println(linkedList.size()); // 输出 1
}

以上示例展示了如何创建一个整型的LinkedList链表,并拥有头插法、尾插法、删除头节点、删除尾节点、获取头节点的值、获取尾节点的值、获取链表长度、依次输出链表的值的功能。

示例二

public static void main(String[] args) {
    LinkedList<String> linkedList = new LinkedList<String>();
    linkedList.addLast("Java");
    linkedList.addFirst("is");
    linkedList.addLast("great");
    linkedList.traverse(); // 输出 is Java great
    linkedList.removeFirst();
    linkedList.addFirst("Programming");
    linkedList.traverse(); // 输出 Programming Java great
    System.out.println(linkedList.size()); // 输出 3
}

以上示例展示了如何创建一个字符串类型的LinkedList链表,并使用尾插法、头插法、删除头节点、在头部插入节点、依次输出链表节点的值及获取链表长度的功能。

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

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

相关文章

  • Java类加载机制实现流程及原理详解

    Java类加载机制实现流程及原理详解 Java类加载机制是Java编译器实现跨平台的核心组成部分,本篇文章将对Java类加载机制的实现流程和原理进行详解。 Java类加载机制的定义 Java编译器将程序代码编译为字节码,并将其放置在class文件中。在程序运行时,Java虚拟机通过Java类加载机制将.class文件中的字节码加载到内存中,并转换成可执行代码…

    other 2023年6月27日
    00
  • win7_32下编译FFmpeg

    Win7 32位系统下编译FFmpeg FFmpeg是一个非常强大的音视频处理工具,而编译FFmpeg可以让我们更好地深入学习它。本篇文章将介绍在Win7 32位系统下编译FFmpeg的详细步骤。 步骤一:搭建编译环境 下载MinGW-w64,建议下载mingw-w64-install.exe。 安装MinGW-w64,并选择32位架构以及安装路径。 打开c…

    其他 2023年3月28日
    00
  • python在if语句中相当于&&(逻辑与)

    在Python中,if语句中的条件表达式可以使用and运算符来实现逻辑与的效果,这与C语言中的&&运算符类似。以下是详细的攻略: 使用and运算符 在Python中,我们可以使用and运算符将两个条件表达式组合在一起,以实现逻辑的效果。当if语句中的条件表达式使用and运算符时,只有当所有条件都为True时,整个条件表达式才为True。以下是…

    other 2023年5月9日
    00
  • java自定义封装StringUtils常用工具类

    下面是详细讲解“java自定义封装StringUtils常用工具类”的完整攻略。 简介 StringUtils是Apache Commons Lang库中的一个常用工具类,提供了大量对字符串的操作方法。然而,有时我们需要扩展该类的功能或自定义一些字符串操作方法。因此,可以自定义封装StringUtils常用工具类。 实现步骤 新建StringUtilsExt…

    other 2023年6月25日
    00
  • Firefox浏览网页时不停抖动解决方案

    针对”Firefox浏览网页时不停抖动”这个问题,我们可以采取以下解决步骤: 步骤一:清除浏览器缓存 浏览器缓存很可能是导致抖动的罪魁祸首。在进入下一步之前,我们先尝试清除浏览器缓存。 打开菜单栏的 “选项”。 选择 “隐私与安全”。 找到 “清除数据” 选项并点击。 在 “清除数据” 窗口中,确保选中了 “缓存”。 点击 “清除数据” 按钮。 清除缓存可以…

    other 2023年6月26日
    00
  • gcc是什么 gcc编译器怎么用

    GCC是什么 GCC(GNU Compiler Collection)是一套由GNU编写的编程语言编译器,支持C、C++、Objective-C、Fortran、Ada、和其他一些语言。GCC是自由软件,可在许多操作系统上使用,包括Linux、UNIX、MacOS和Windows。 GCC编译器怎么用 GCC是命令行工具,可以通过终端或命令提示符编译代码。以…

    other 2023年6月26日
    00
  • C#非递归先序遍历二叉树实例

    C#非递归先序遍历二叉树实例 本文将介绍如何用C#实现非递归的先序遍历二叉树,并给出两个具体的实例说明。 前置知识 在阅读本文前,需要先了解二叉树的相关定义和先序遍历的实现方式,以及C#的基本语法。 非递归先序遍历 对于一颗二叉树,其先序遍历的过程就是先遍历根节点,然后递归地遍历左子树和右子树。而非递归的先序遍历,可以通过使用栈来实现。 具体实现过程如下:1…

    other 2023年6月27日
    00
  • Win10怎么自定义设置文件资源管理器打开位置?

    当我们在 Windows 10 中打开文件资源管理器时,默认情况下会打开“快速访问”页面,也就是最近访问和收藏的文件和文件夹列表。然而,我们可能希望直接打开某个特定的文件夹,比如我们项目常用的文件夹,这时就需要对文件资源管理器的默认打开位置进行自定义设置。以下是详细的攻略: 1. 打开文件资源管理器 首先,我们需要在 Windows 10 中打开文件资源管理…

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