Java数据结构之双向链表图解

以下是Java数据结构之双向链表图解的完整攻略:

一、双向链表简介

1.1 定义

双向链表(Doubly Linked List),也叫双向链式线性表,是链式存储结构的基本形式之一。双向链表的每个节点都含有两个指针,分别指向前驱节点和后继节点,因此可以支持双向遍历。

1.2 结构

双向链表的结构可以用下图表示:

  +-------+    +-------+    +-------+
  |节点 1 |<-->|节点 2 |<-->|节点 3 |
  +-------+    +-------+    +-------+
  |  data |    |  data |    |  data |
  |  prev |<---|  prev |<---|  prev |
  |  next |--->|  next |--->|  next |
  +-------+    +-------+    +-------+

其中,每个节点都有data、prev、next三个属性,分别表示数据、前驱节点、后继节点。

二、双向链表的Java实现

下面我们来实现一个双向链表,并包含如下操作:

  • 新增节点
  • 删除节点
  • 查找节点
  • 遍历节点
public class DoublyLinkedList {

    private Node head; // 头节点

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

        public Node(int data) {
            this.data = data;
        }
    }

    /**
     * 新增节点
     *
     * @param data 数据
     */
    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node temp = head;
            while (temp.next != null) {
                temp = temp.next;
            }
            temp.next = newNode;
            newNode.prev = temp;
        }
    }

    /**
     * 删除节点
     *
     * @param data 数据
     */
    public void remove(int data) {
        Node temp = head;
        while (temp != null) {
            if (temp.data == data) {
                if (temp.prev != null) {
                    temp.prev.next = temp.next;
                } else {
                    head = temp.next;
                }
                if (temp.next != null) {
                    temp.next.prev = temp.prev;
                }
                break;
            }
            temp = temp.next;
        }
    }

    /**
     * 查找节点
     *
     * @param data 数据
     * @return 节点
     */
    public Node find(int data) {
        Node temp = head;
        while (temp != null) {
            if (temp.data == data) {
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }

    /**
     * 遍历节点,从前向后遍历
     */
    public void traverseForward() {
        Node temp = head;
        while (temp != null) {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
        System.out.println();
    }

    /**
     * 遍历节点,从后向前遍历
     */
    public void traverseBackward() {
        Node temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        while (temp != null) {
            System.out.print(temp.data + " ");
            temp = temp.prev;
        }
        System.out.println();
    }
}

三、双向链表的示例操作

3.1 新增节点

public static void main(String[] args) {
    DoublyLinkedList list = new DoublyLinkedList();
    list.add(1);
    list.add(2);
    list.add(3);
    list.traverseForward(); // 1 2 3
}

3.2 删除节点

public static void main(String[] args) {
    DoublyLinkedList list = new DoublyLinkedList();
    list.add(1);
    list.add(2);
    list.add(3);
    list.traverseForward(); // 1 2 3
    list.remove(1);
    list.traverseForward(); // 2 3
}

以上就是Java数据结构之双向链表图解的完整攻略,希望对您有所帮助。

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

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

相关文章

  • JavaScript数据结构和算法之二叉树详解

    JavaScript数据结构和算法之二叉树详解 什么是二叉树? 二叉树是一种树形结构,其中每个节点最多有两个子节点:左子节点和右子节点。每个节点都是一个对象,包括属性和方法。节点的属性可能包括值,左节点和右节点。节点的方法可能包括插入和删除。 二叉树的应用场景 二叉树的常用场景包括: 排序算法(二叉排序树); 表达式求值; 线段树; 图形图像学; 数据压缩算…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法入门实例详解

    Java数据结构与算法入门实例详解攻略 概述 本攻略主要介绍Java数据结构与算法入门实例详解,包括学习的目标、适合的人群、学习方法等。通过本攻略的学习,可以更好地掌握Java数据结构和算法的基本知识,提升编程水平。 学习目标 本攻略的学习目标为: 掌握Java基础数据结构,如数组、链表、栈、队列等; 理解并掌握常见算法,如排序、查找、递归等; 掌握Java…

    数据结构 2023年5月17日
    00
  • 数据结构 双机调度问题的实例详解

    数据结构:双机调度问题的实例详解 本文主要讲解数据结构中双机调度问题的实例详解,涉及到相关的算法和代码实现。双机调度问题是指如何安排多个任务在两台机器上执行,使得两台机器的工作时间尽可能相等,从而达到最优的调度效果。 1. 问题分析 假设有 $n$ 个任务,每个任务的执行时间分别为 $t_1, t_2, …, t_n$,需要按照某种调度方案分配给两台机器…

    数据结构 2023年5月17日
    00
  • JavaScript 数据结构之散列表的创建(2)

    下面是详细讲解“JavaScript 数据结构之散列表的创建(2)”的完整攻略。 散列表(哈希表) 散列表是一种数据结构,使用哈希函数将键映射到索引。散列表可以在常量时间 O(1) 中进行插入、删除和查找操作,但也具有碰撞冲突问题。 碰撞冲突问题 在散列表中,当两个不同的键通过哈希函数映射到了同一个索引位置时,就会发生碰撞冲突问题。解决碰撞冲突问题的方法有很…

    数据结构 2023年5月17日
    00
  • C++ 数据结构超详细讲解单链表

    C++ 数据结构超详细讲解单链表 什么是单链表 单链表是一种常见的线性数据结构,它由若干个节点组成,每个节点包含两部分内容:数据域和指针域。其中数据域存储节点所携带的数据,而指针域存储下一个节点的地址。 单链表的性质在于每个节点只有一个指针域,而第一个节点叫做头节点,通常不存放数据,只用来标注链表的起始位置。最后一个节点的指针域指向 NULL,即表示链表的结…

    数据结构 2023年5月17日
    00
  • [paper reading]|IC-FPS: Instance-Centroid Faster Point Sampling Module for 3D Point-base

    摘要: 本文说首次实现了大规模点云场景中基于点的模型的实时检测(<30ms); 首先指出FPS采样策略进行下采样是耗时的,尤其当点云增加的时候,计算量和推理时间快速增加; 本文提出IC-FPS;包含两个模块:local feature diffusion based background point filter (LFDBF);Centroid In…

    算法与数据结构 2023年4月17日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

    数据结构 2023年5月17日
    00
  • 【ACM组合数学 | 错排公式】写信

    题目链接:https://ac.nowcoder.com/acm/contest/54484/B 题意很简单,但是数据范围偏大。 错排公式 首先来推导一下错排公式: \[D(n) = n!\sum_{k=0}^{n}\frac{(-1)^k}{k!} \] 设一个函数: \[S_i表示一个排列中p_i = i的方案数 \] 那么我们可以知道: \[D(n) …

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部