java代码实现双向链表

下面我为大家详细讲解如何使用Java代码实现双向链表。

什么是双向链表?

双向链表是一种数据结构,与单向链表类似,但其每个节点还会连接到其前驱节点。一个节点包括数据域和两个指针域,分别指向前后两个节点。可以看做是两个单向链表的结合体。

双向链表的实现

1. 定义节点类

Java代码中,需要先定义一个节点类来表示链表中的每个节点。Java代码实现如下:

public class ListNode {
    int val;
    ListNode prev;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.prev = null;
        this.next = null;
    }
}

ListNode表示一个节点,包含val表示节点存储的值,prev表示前一个节点,next表示后一个节点。我们使用构造函数来初始化这些值。

2. 实现双向链表类

接下来,实现双向链表类,包含添加节点、删除节点、输出链表等基本操作。Java代码实现如下:

public class DoublyLinkedList {
    private ListNode head;
    private ListNode tail;
    private int size;

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

    public void addFirst(int val) {
        ListNode node = new ListNode(val);
        if (head == null) {
            head = tail = node;
        } else {
            node.next = head;
            head.prev = node;
            head = node;
        }
        size++;
    }

    public void addLast(int val) {
        ListNode node = new ListNode(val);
        if (tail == null) {
            head = tail = node;
        } else {
            tail.next = node;
            node.prev = tail;
            tail = node;
        }
        size++;
    }

    public void addAtIndex(int index, int val) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("Invalid index");
        } else if (index == 0) {
            addFirst(val);
        } else if (index == size) {
            addLast(val);
        } else {
            ListNode node = new ListNode(val);
            ListNode cur = getNodeAtIndex(index);
            ListNode prev = cur.prev;
            prev.next = node;
            node.prev = prev;
            node.next = cur;
            cur.prev = node;
            size++;
        }
    }

    public ListNode getNodeAtIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Invalid index");
        }
        ListNode cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur;
    }

    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Invalid index");
        }
        ListNode cur = getNodeAtIndex(index);
        ListNode prev = cur.prev;
        ListNode next = cur.next;
        if (prev == null) {
            head = next;
        } else {
            prev.next = next;
        }
        if (next == null) {
            tail = prev;
        } else {
            next.prev = prev;
        }
        size--;
    }

    public void printList() {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }
}

DoublyLinkedList表示双向链表类,包含头指针head、尾指针tail和链表节点个数size,下面介绍一下几个核心方法。

  • addFirst方法:在链表头部添加节点。
  • addLast方法:在链表尾部添加节点。
  • addAtIndex方法:在链表的index位置添加节点,如果index位置越界,则抛出异常。
  • deleteAtIndex方法:删除链表中index位置的节点,如果index位置越界,则抛出异常。
  • getNodeAtIndex方法:获取链表中index位置的节点。
  • printList方法:输出链表中所有节点的值。

这样,我们就实现了一个双向链表类。

3. 示例

下面通过两个示例说明如何使用我们刚刚实现的双向链表。

示例1:在双向链表中添加节点

public static void main(String[] args) {
    DoublyLinkedList list = new DoublyLinkedList();
    list.addFirst(1);
    list.addLast(3);
    list.addAtIndex(1, 2);
    list.printList();
    // 输出结果:1 2 3
}

在示例中,首先创建了一个双向链表对象list,然后在链表头部添加节点1,接着在链表尾部添加节点3,最后在链表的第二个位置插入节点2,然后输出完整的链表节点值。

示例2:在双向链表中删除节点

public static void main(String[] args) {
    DoublyLinkedList list = new DoublyLinkedList();
    list.addFirst(1);
    list.addLast(2);
    list.addLast(3);
    list.deleteAtIndex(1);
    list.printList();
    // 输出结果:1 3
}

在示例中,首先创建了一个双向链表对象list,然后在链表头部添加节点1,接着在链表尾部添加节点2和节点3,之后删除了第二个节点,并输出完整的链表节点值。

总结

以上就是Java代码实现双向链表的完整攻略了。双向链表和单向链表主要区别在于节点除了保存指向下一个节点的指针外,还保存指向上一个节点的指针。通过使用Java代码,我们可以轻松地创建和操作双向链表,实现常见的链表操作,如添加节点、删除节点等。

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

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

相关文章

  • 详解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅

    下面我将详细讲解“详解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅”的完整攻略。 什么是JNI JNI(Java Native Interface),即Java本地接口,是Java提供的一种机制,允许Java代码和本地代码(如C/C++代码)进行交互。可以让Java程序调用C/C++函数,也可以让C/C++程序调用Java函数。…

    other 2023年6月26日
    00
  • Windows Bat脚本实现定时重启应用程序的项目实践

    接下来我将详细讲解“Windows Bat脚本实现定时重启应用程序的项目实践”的完整攻略。 项目概述 本项目旨在使用Windows命令行编写一个Bat脚本,实现定时重启应用程序的功能。 实现步骤 以下是实现定时重启应用程序的步骤: 打开 Windows 命令提示符,进入目标应用所在目录。(示例中我们假设目标应用为 test.exe) cd C:\path\t…

    other 2023年6月27日
    00
  • Android开发之TabActivity用法实例详解

    Android开发之TabActivity用法实例详解 简介 在Android开发中,TabActivity是一个用于创建带有选项卡的界面的类。它可以让用户通过点击选项卡来切换不同的界面内容。本攻略将详细介绍TabActivity的用法,并提供两个示例说明。 步骤 步骤一:创建TabActivity类 首先,我们需要创建一个继承自TabActivity的类。…

    other 2023年9月6日
    00
  • MySQL中LIKE子句相关使用的学习教程

    MySQL中LIKE子句相关使用的学习教程 简介 在MySQL中,LIKE子句用于在查询中模糊匹配字符串。它可以帮助我们查找包含特定模式的数据。本教程将详细介绍MySQL中LIKE子句的使用方法,并提供两个示例说明。 语法 LIKE子句的基本语法如下: SELECT 列名 FROM 表名 WHERE 列名 LIKE ‘模式’; 示例1:查找以特定字符开头的数…

    other 2023年8月18日
    00
  • windows磁盘API实践

    Windows磁盘API实践的完整攻略 本文将为您提供Windows磁盘API实践的完整攻略,包括介绍、步骤和两个示例说明。 介绍 Windows磁盘API是一组用于管理磁盘和文件系统的API,可以用于创建、删除、格式化、读取和写入磁盘等操作。使用Windows磁盘API可以方便地进行磁盘管理和文件操作,提高系统的可靠性和性能。 步骤 使用Windows磁盘…

    other 2023年5月6日
    00
  • BJDCTF 2nd web

    BJDCTF 2nd web 欢迎来到 BJDCTF 第二次网络安全比赛的官方网站!在这里,您将参与到激烈的CTF比赛中,展现您的技能和创造力。在比赛中,我们会为您准备各种挑战,包括Web、Crypto、Pwn、Re、Misc等多个领域,您可以选择自己擅长的领域进行比赛。 竞赛时间 比赛时间:2021年9月18日-2021年9月20日。 奖励 我们会提供丰富…

    其他 2023年3月28日
    00
  • Python命名空间的本质和加载顺序

    Python命名空间的本质和加载顺序攻略 Python中的命名空间是一个用于存储变量名称和其对应对象的映射关系的系统。在Python中,每个对象都存储在一个命名空间中,以便在代码中进行访问和使用。本攻略将详细讲解Python命名空间的本质和加载顺序,并提供两个示例来说明。 1. 命名空间的本质 命名空间是一个字典对象,用于存储变量名称和其对应对象的映射关系。…

    other 2023年8月8日
    00
  • 一文了解SUI币是什么币 SUI币是哪个国家的

    一文了解SUI币是什么币 简介 SUI币是一种加密货币,也被称为数字货币或虚拟货币。它是由一个名为SUI的项目发行的,旨在成为一种去中心化的数字资产,用于在SUI生态系统中进行交易和支付。 SUI币的国家背景 SUI币并没有特定的国家背景,它是一个全球性的项目。虽然SUI币的团队可能来自特定的国家或地区,但它的使用和交易并不受限于任何特定的国家或地区。 SU…

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