Java数据结构之双向链表的实现

Java数据结构之双向链表的实现

一、双向链表的定义

双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。

二、双向链表的实现

1. 定义节点

首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下:

public class Node {
    int value;
    Node pre;
    Node next;
    public Node(int value) {
        this.value = value;
        this.pre = null;
        this.next = null;
    }
}

2. 定义双向链表类

接着,我们需要定义一个双向链表类,包含指向链表头部的指针head和指向链表尾部的指针tail,代码如下:

public class DoubleLinkedList {
    Node head;
    Node tail;
    public DoubleLinkedList() {
        this.head = null;
        this.tail = null;
    }
}

3. 双向链表的添加操作

双向链表的添加操作和单向链表类似,但需要注意的是在添加节点时,要同时更新前一个节点和后一个节点的指针pre和next,代码如下:

public void add(int value) {
    Node node = new Node(value);
    if (head == null) {
        head = node;
        tail = node;
        return;
    }
    tail.next = node;
    node.pre = tail;
    tail = node;
}

4. 双向链表的删除操作

双向链表的删除操作同样需要同时更新前一个节点和后一个节点的指针pre和next,代码如下:

public void remove(int value) {
    Node current = head;
    while (current != null) {
        if (current.value == value) {
            if (current == head) {
                head = current.next;
                head.pre = null;
            } else if (current == tail) {
                tail = current.pre;
                tail.next = null;
            } else {
                current.pre.next = current.next;
                current.next.pre = current.pre;
            }
            return;
        }
        current = current.next;
    }
}

5. 双向链表的遍历操作

双向链表的遍历操作可以从头部开始遍历,也可以从尾部开始遍历,代码如下:

从头部开始遍历:

public void traverseFromHead() {
    Node current = head;
    while (current != null) {
        System.out.print(current.value + " ");
        current = current.next;
    }
}

从尾部开始遍历:

public void traverseFromTail() {
    Node current = tail;
    while (current != null) {
        System.out.print(current.value + " ");
        current = current.pre;
    }
}

三、示例说明

1. 示例一

DoubleLinkedList list = new DoubleLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.remove(2);
list.traverseFromHead();

输出结果:

1 3 4

2. 示例二

DoubleLinkedList list = new DoubleLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.traverseFromTail();

输出结果:

4 3 2 1

四、总结

双向链表相对于单向链表,除了可以遍历指向下一个节点的指针next外,还可以遍历指向前一个节点的指针pre。因此,在一些特定的场景下,双向链表可以更加方便地进行操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之双向链表的实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究 什么是约瑟夫环问题? 约瑟夫环问题(Josephus problem)是一个经典的问题,据说是Flavius Josephus发现并命名的。该问题描述为,编号从1到n的n个人按照顺时针方向围坐成一圈,每人持有一个密码。从第1个人开始,顺时针方向每次完整的数m个人,然后让这m个人出圈并把他们的密码拿走不算。当到达队尾时,又从队…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之哈希算法实现

    Java 数据结构与算法系列精讲之哈希算法实现 什么是哈希算法? 哈希算法是一种能将任意长度的消息压缩到某一固定长度的消息摘要的算法。 通过哈希算法,我们可以将一个任意的大数据量压缩成一段固定长度的数据,这个数据的长度通常比较小,相对于原数据的大小来说,要小得多。哈希算法的压缩特性使得它经常用来进行信息摘要、数据校验、唯一识别等功能,可以很大程度上提高数据的…

    数据结构 2023年5月17日
    00
  • C++数据结构之搜索二叉树的实现

    C++数据结构之搜索二叉树的实现 搜索二叉树(Binary Search Tree, BST)是一种常见的数据结构,它支持快速地查找、插入和删除元素。本文将详细讲述如何用C++实现搜索二叉树。 一、搜索二叉树的定义 搜索二叉树是一种二叉树,它满足以下性质: 对于任意一个节点,其左子树中的所有节点都小于它,其右子树中的所有节点都大于它; 每个节点的左右子树也都…

    数据结构 2023年5月17日
    00
  • 贪心算法基础及leetcode例题

    理论 本质:找到每个阶段的局部最优,然后去推导得到全局最优两个极端:常识&&很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做! 套路:贪心没有套路,说白了就是常识性推导加上举反例做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 贪心算法一般分为如下…

    算法与数据结构 2023年4月20日
    00
  • 【JavaScript快速排序算法】不同版本原理分析

    说明 快速排序(QuickSort),又称分区交换排序(partition-exchange sort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速…

    算法与数据结构 2023年4月18日
    00
  • php数据结构与算法(PHP描述) 查找与二分法查找

    以下是详细讲解“php数据结构与算法(PHP描述) 查找与二分法查找”的完整攻略。 1. 数据结构与算法简介 数据结构是计算机中存储和组织数据的方式。它涉及到数据的表示、处理和存储方式等。 算法则是完成特定任务的步骤集合。算法设计可以优化计算机程序的效率和速度。 PHP是一种非常流行的服务器端脚本语言,数据结构和算法对web开发者来说非常重要。因此,我们需要…

    数据结构 2023年5月17日
    00
  • 一文吃透JS树状结构的数据处理(增删改查)

    一文吃透JS树状结构的数据处理(增删改查) 什么是树状结构 树状结构是一种经典的数据结构,在计算机领域中被广泛应用。树状结构由连通的节点组成,节点之间形成父子关系。一根树状结构的“根节点”没有父节点,每个子节点可以有多个“子节点”,但一个“子节点”只能有一个“父节点”。常见的应用包括文件系统、HTML DOM 和 JSON 数据格式等。 数据结构设计 我们以…

    数据结构 2023年5月17日
    00
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 链表介绍 链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。 归并排序原理 归并排序是一种分治思想的算法,…

    数据结构 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部