Java中双向链表详解及实例

yizhihongxing

Java中双向链表详解及实例

什么是双向链表?

双向链表是一种经典的线性数据结构,它不仅能够支持插入、删除操作,而且还能够支持在链表中任何位置进行查找操作。

双向链表的每个节点都有两个指针,分别是指向前驱节点和后继节点的指针,这样就可以通过前向和后向遍历节点,从而实现各种操作。

双向链表的定义

下面是Java语言中双向链表的定义:

class Node {
    int data;
    Node prev;
    Node next;

    Node(int data) {
        this.data = data;
        this.prev = null;
        this.next = null;
    }
}

其中,data表示节点中的数据,prev表示节点的前驱节点,next表示节点的后继节点。

双向链表的基本操作

双向链表的基本操作包括插入、删除和查找,下面分别讲解。

插入操作

双向链表的插入操作有三中情况:

  1. 在双向链表的头部插入节点
  2. 在双向链表的尾部插入节点
  3. 在双向链表的中间插入节点

在双向链表的头部插入节点

在双向链表的头部插入节点的代码如下:

public void addFirst(Node node) {
    if(head == null) {
        head = node;
        tail = node;
    } else {
        node.next = head;
        head.prev = node;
        head = node;
    }
}

说明:

  • 如果链表为空,将新加入的节点同时作为头指针和尾指针。
  • 如果链表不为空,则将新加入的节点与原来的头节点相连,同时将新加入的节点设为头节点。

在双向链表的尾部插入节点

在双向链表的尾部插入节点的代码如下:

public void addLast(Node node) {
    if(tail == null) {
        head = node;
        tail = node;
    } else {
        node.prev = tail;
        tail.next = node;
        tail = node;
    }
}

说明:

  • 如果链表为空,将新加入的节点同时作为头指针和尾指针。
  • 如果链表不为空,则将新加入的节点与原来的尾节点相连,同时将新加入的节点设为尾节点。

在双向链表的中间插入节点

在双向链表的中间插入节点的代码如下:

public void addAfter(Node node, Node newNode) {
    if(node == null || newNode == null) {
        return;
    }
    newNode.prev = node;
    newNode.next = node.next;
    if(node.next != null) {
        node.next.prev = newNode;
    } else {
        tail = newNode;
    }
    node.next = newNode;
}

说明:

  • 首先判断空指针的情况。
  • 将新加入的节点与原节点相连。
  • 注意判断原节点是否为尾节点的情况。

删除操作

双向链表的删除操作也有三中情况:

  1. 删除双向链表的头节点
  2. 删除双向链表的尾节点
  3. 删除双向链表的中间节点

删除双向链表的头节点

删除双向链表的头节点的代码如下:

public void removeFirst() {
    if(head == null) {
        return;
    }
    if(head == tail) {
        head = null;
        tail = null;
    } else {
        head = head.next;
        head.prev = null;
    }
}

说明:

  • 如果链表为空,则直接退出。
  • 如果链表中只有一个节点,则将头指针和尾指针都设为空。
  • 如果链表中不止一个节点,则将头指针设为原来头节点的下一个节点,并将新头节点的前驱指针设为空。

删除双向链表的尾节点

删除双向链表的尾节点的代码如下:

public void removeLast() {
    if(tail == null) {
        return;
    }
    if(head == tail) {
        head = null;
        tail = null;
    } else {
        tail = tail.prev;
        tail.next = null;
    }
}

说明:

  • 如果链表为空,则直接退出。
  • 如果链表中只有一个节点,则将头指针和尾指针都设为空。
  • 如果链表中不止一个节点,则将尾指针设为原来尾节点的前一个节点,并将新尾节点的后继指针设为空。

删除双向链表的中间节点

删除双向链表的中间节点的代码如下:

public void removeNode(Node node) {
    if(node == null) {
        return;
    }
    if(head == node) {
        removeFirst();
    } else if(tail == node) {
        removeLast();
    } else {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
}

说明:

  • 首先判断空指针的情况。
  • 如果要删除的是头节点,则直接调用上面的删除头节点的函数。
  • 如果要删除的是尾节点,则直接调用上面的删除尾节点的函数。
  • 如果要删除的节点在中间,则将要删除的节点相邻的节点相连起来即可。

查找操作

双向链表的查找操作可以按照元素值或者位置进行查找。以下示例演示如何通过元素值进行查找:

public Node findNode(int data) {
    Node cur = head;
    while(cur != null) {
        if(cur.data == data) {
            return cur;
        }
        cur = cur.next;
    }
    return null;
}

说明:

  • 从头节点开始遍历整个链表。
  • 如果节点的元素值等于要查找的值,则返回该节点。
  • 如果遍历完整个链表都没有找到对应的节点,则返回空指针。

双向链表的测试示例

下面展示如何对上述代码进行测试:

public class Test {
    public static void main(string[] args) {
        DoublyLinkedList list = new DoublyLinkedList();
        list.addFirst(new Node(1));
        list.addFirst(new Node(2));
        list.addFirst(new Node(3));
        list.addLast(new Node(4));
        list.addLast(new Node(5));
        list.removeLast();
        list.removeFirst();
        Node node = list.findNode(2);
        list.removeNode(node);
    }
}

说明:

  • 首先创建一个双向链表对象。
  • 对链表进行一系列的插入、删除和查找操作。
  • 最后打印出链表来查看结果。

双向链表的应用场景

双向链表可以用于许多数据存储的场景,比如某些排序算法的实现,也可以作为其他数据结构的底层实现,比如Java集合框架中的LinkedList类就是基于双向链表实现的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中双向链表详解及实例 - Python技术站

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

相关文章

  • 【iOS开发】如何用 Swift 语言进行LBS应用的开发?

    【iOS开发】如何用 Swift 语言进行LBS应用的开发? LBS(Location-Based Service)是一种基于位置信息的服务,可以为用户提供周边信息、导航、地图等功能。在iOS开发中,我们可以使用Swift语言来开发LBS应用。本文将介绍如何使用Swift语言进行LBS应用的开发,包括获取用户位置、显示地图、搜索周边信息等。 1. 获取用户位…

    other 2023年5月5日
    00
  • mac系统安装教程

    来访问我们网站的用户可能会需要关于在 Mac 系统上安装软件的详细说明。以下是一份 Mac 系统安装教程的完整攻略。 Mac 系统安装教程 前言 在 Mac 上安装软件程序通常比 Windows 或 Linux 更容易,因为大多数软件都已经构建成只需拖放即可完成安装过程的 .dmg 文件。但是,有许多情况你需要使用其他方法进行安装,本文将为你提供完整的 Ma…

    其他 2023年4月16日
    00
  • Python获取本机所有网卡ip,掩码和广播地址实例代码

    Python获取本机所有网卡IP、掩码和广播地址实例代码攻略 在Python中,我们可以使用socket模块来获取本机所有网卡的IP地址、掩码和广播地址。下面是一个完整的攻略,包含了两个示例说明。 步骤1:导入必要的模块 首先,我们需要导入socket模块来进行网络相关的操作。在Python中,socket模块提供了一些函数和常量,用于创建套接字、发送和接收…

    other 2023年7月31日
    00
  • 安卓6.0m系统下载地址 android 6.0m官网下载

    安卓6.0m系统下载攻略 安卓6.0m系统是一款较旧的安卓操作系统版本,但仍然有一些用户需要下载和安装它。在本攻略中,我将为您提供安卓6.0m系统的下载地址和详细步骤。 下载地址 您可以从以下两个来源之一下载安卓6.0m系统: 官方网站下载:您可以访问安卓官方网站来获取安卓6.0m系统的下载链接。请按照以下步骤进行操作: 打开您的浏览器,并访问安卓官方网站。…

    other 2023年8月4日
    00
  • 微信小程序引入外部js方法

    以下是关于如何在微信小程序中引入外部JS方法的详细攻略: 微信小程序引入外部JS方法简介 微信小程序是一种轻量级的应用程序,它可以在微信运行。在开发微信小程序时,您可能需要使用外部JS方法来实现某些功能。本攻略将介绍如何在微小程序中引入外部JS方法。 微信小程序引入外部JS方法的设置步骤 以下是在微信小程序中引入外部JS方法的步骤: 1.外部JS文件:首先,…

    other 2023年5月7日
    00
  • Python 启动时选择32位 或64位版的操作

    Python 启动时选择32位或64位版的操作攻略 在启动 Python 时选择使用 32 位或 64 位版本,可以根据操作系统和 Python 安装的版本进行设置。下面是详细的攻略: 步骤 1:确定操作系统和 Python 版本 首先,确定你的操作系统和已安装的 Python 版本。这将决定你可以选择的位数选项。 对于 Windows 操作系统,可以通过以…

    other 2023年7月28日
    00
  • Win11全新开发预设选项体验: 提高生产力 引入 Dev Home应用

    Win11全新开发预设选项体验攻略 Win11在开发工具方面进行了全新的更新,其中提出了全新的预设选项,为开发者提供更加高效的开发体验。在这篇攻略中,我们将介绍如何利用Win11的预设选项体验来提高生产力,并介绍一款非常实用的Dev Home应用。 更新Win11系统 首先,要使用Win11的全新开发预设选项,你需要先更新你的操作系统。打开Windows设置…

    other 2023年6月26日
    00
  • python链表类中获取元素实例方法

    获取元素是链表类中常见的操作之一。对于Python链表,要获取元素通常有两种方法:索引和迭代器。 索引 要获取链表中的某个元素,可以通过索引来实现。在Python链表中,可以使用下标操作符[]来获取链表中特定位置的元素。下标从0开始,代表链表的第1个元素。 示例1:获取链表中指定位置的元素 class Node: def __init__(self, dat…

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