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日

相关文章

  • 讲解Python中for循环下的索引变量的作用域

    讲解Python中for循环下的索引变量的作用域 在Python中,for循环是一种常用的迭代结构,用于遍历可迭代对象(如列表、元组、字符串等)。在for循环中,我们可以使用一个索引变量来追踪当前迭代的位置。然而,需要注意的是,索引变量的作用域在for循环内部。 作用域的概念 作用域是指变量在程序中可访问的范围。在Python中,变量的作用域可以是全局作用域…

    other 2023年8月20日
    00
  • Go 实现 WebSockets和什么是 WebSockets

    什么是 WebSockets WebSockets 是一种在单个 TCP 连接上进行全双工通信的协议。传统上,标准的 HTTP 通信通过客户端发出请求,服务器响应请求,然后终止连接。但是,在 WebSockets 中,连接保持开放状态,使双方能够通过 WebSockets 连接交换数据。 Go 实现 WebSockets Go 语言中可以使用内置的 net/…

    other 2023年6月27日
    00
  • 罪恶装备Xrd SIGN停止工作黑屏等问题的解决方法

    罪恶装备Xrd SIGN停止工作黑屏等问题的解决方法 在玩《罪恶装备Xrd SIGN》时,有可能会遇到游戏停止工作、黑屏等问题,这些问题可能是由于多种原因引起的。下面我们将对这些问题进行详细的解决方案。 问题一:游戏停止工作 解决方法: 确保您的电脑系统是兼容罪恶装备Xrd SIGN的,且满足游戏运行的最低配置要求。 关闭安装在计算机上的任何游戏加速器、杀毒…

    other 2023年6月27日
    00
  • Mybatis参数传递示例代码

    MyBatis参数传递示例代码攻略 MyBatis是一个流行的Java持久化框架,它提供了灵活的参数传递方式。在本攻略中,我们将详细讲解MyBatis参数传递的示例代码,并提供两个示例说明。 1. 基本参数传递方式 MyBatis支持多种参数传递方式,包括基本类型、JavaBean、Map等。下面是一个基本参数传递的示例代码: public interfac…

    other 2023年7月29日
    00
  • miui7.1稳定版下载 小米miui7.1稳定版固件下载地址

    MIUI 7.1稳定版下载攻略 MIUI是小米公司自家开发的一款基于Android系统的操作界面,它提供了丰富的个性化功能和优化的用户体验。如果你想下载MIUI 7.1稳定版固件,下面是一个详细的攻略,包含了下载地址和示例说明。 步骤一:访问官方网站 首先,你需要访问小米官方网站以获取MIUI 7.1稳定版固件的下载地址。你可以在浏览器中输入以下网址进行访问…

    other 2023年8月4日
    00
  • gitlab启动、停止、重启(两种启动方式)

    以下是“GitLab启动、停止、重启(两种启动方式)”的完整攻略: GitLab启动、停止、重启(两种启动方式) GitLab是一个基于Web的Git存库管理工,它提供了一个完整的Git存储库管理解决方案。本攻略将介绍如何启动、停止和重启GitLab,并提供两种启动方式的示例。 步骤1:启动GitLab 要启动GitLab,可以使用以下命令: sudo gi…

    other 2023年5月7日
    00
  • Android如何实现URL转换成二维码

    Android实现URL转换成二维码攻略 在Android应用中,我们可以使用ZXing库来实现URL转换成二维码的功能。下面是详细的攻略: 步骤一:添加依赖 首先,在你的Android项目中的build.gradle文件中添加ZXing库的依赖: implementation ‘com.google.zxing:core:3.4.1’ implementa…

    other 2023年8月26日
    00
  • Golang递归获取目录下所有文件方法实例

    Golang递归获取目录下所有文件方法实例 在Golang中要递归获取目录下所有文件,可以很方便地通过标准库中的filepath.Walk函数来实现,下面将详细讲解这个过程。 1. 使用filepath.Walk函数 filepath.Walk函数的定义如下: func Walk(root string, walkFn WalkFunc) error roo…

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