Java数据结构之顺序表和链表精解

yizhihongxing

Java数据结构之顺序表和链表精解

简介

在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通俗地讲,数据结构就是组织和存储数据的一种方式,目的是在计算机程序中高效地访问和修改数据。

顺序表

顺序表是一种线性表结构,它是由一组地址连续的存储单元组成,元素之间的物理顺序保持与逻辑顺序一致。因此,顺序表的元素可以随机访问,访问速度快,但插入和删除元素需要移动其他元素,比较耗时。

定义

在Java中,使用数组来实现顺序表,定义如下:

public class ArrayList<E> {

    private static final int DEFAULT_CAPACITY = 10;
    private Object[] elementData;
    private int size;

    public ArrayList() {
        elementData = new Object[DEFAULT_CAPACITY];
    }

    public ArrayList(int initialCapacity) {
        elementData = new Object[initialCapacity];
    }

    public int size() {
        return size;
    }

    public E get(int index) {
        if (index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return (E) elementData[index];
    }

    public void add(E e) {
        ensureCapacity(size + 1);
        elementData[size++] = e;
    }

    private void ensureCapacity(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity < minCapacity) {
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity < minCapacity) {
                newCapacity = minCapacity;
            }
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    }
}

使用示例

创建一个空的ArrayList对象:

ArrayList<String> list = new ArrayList<String>();

添加元素到ArrayList中:

list.add("Java");
list.add("数据结构");
list.add("算法");

访问ArrayList中的元素:

System.out.println(list.get(0));  // Output: Java
System.out.println(list.get(1));  // Output: 数据结构
System.out.println(list.get(2));  // Output: 算法

链表

链表是一种线性表结构,它是由若干个节点组成,每个节点包含一个数据元素和指向下一个节点的指针。因此,链表的元素不能随机访问,只能从头节点开始顺序访问,访问速度比较慢,但插入和删除元素只需要修改指针,不需要移动其他元素,比较快捷。

定义

在Java中,链表使用Node类来表示节点,定义如下:

public class Node<E> {

    private E data;
    private Node<E> next;

    public Node(E data, Node<E> next) {
        this.data = data;
        this.next = next;
    }

    public E getData() {
        return data;
    }

    public Node<E> getNext() {
        return next;
    }

    public void setNext(Node<E> next) {
        this.next = next;
    }
}

由Node类可以组成链表,定义如下:

public class LinkedList<E> {

    private Node<E> head;
    private int size;

    public LinkedList() {
        head = new Node<E>(null, null);
        size = 0;
    }

    public int size() {
        return size;
    }

    public void add(E e) {
        Node<E> newNode = new Node<E>(e, null);
        Node<E> currentNode = head;
        while (currentNode.getNext() != null) {
            currentNode = currentNode.getNext();
        }
        currentNode.setNext(newNode);
        size++;
    }

    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        int i = 0;
        Node<E> currentNode = head.getNext();
        while (i < index) {
            currentNode = currentNode.getNext();
            i++;
        }
        return currentNode.getData();
    }
}

使用示例

创建一个空的LinkedList对象:

LinkedList<String> list = new LinkedList<String>();

添加元素到LinkedList中:

list.add("Java");
list.add("数据结构");
list.add("算法");

访问LinkedList中的元素:

System.out.println(list.get(0));  // Output: Java
System.out.println(list.get(1));  // Output: 数据结构
System.out.println(list.get(2));  // Output: 算法

总结

顺序表和链表都是常用的数据结构,选择哪一种数据结构要考虑具体应用场景。如果经常需要随机访问元素,应该选择顺序表;如果经常需要插入和删除元素,应该选择链表。

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

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

相关文章

  • matlabr2017b安装及破解(安装详解)

    MATLAB R2017b安装及破解(安装详解) MATLAB是一款具有强大数值计算和数据分析能力的科学计算软件,因此广泛应用于科学和工程领域。本文将介绍MATLAB R2017b的安装及破解过程,帮助用户快速使用该软件。 下载MATLAB R2017b 首先,用户需要从MATLAB官网上下载R2017b的安装文件(可执行程序或光盘镜像文件)。安装程序的大小…

    其他 2023年3月29日
    00
  • 浅谈JavaScript的函数及作用域

    浅谈JavaScript的函数及作用域 函数的定义和使用 JavaScript中的函数是一段可重复使用的代码块,用于执行特定的任务。函数可以接受参数,并且可以返回一个值。 函数的定义使用关键字function,后面跟着函数名和一对圆括号,圆括号中可以包含参数列表。函数体由一对花括号包围,其中包含了函数要执行的代码。 下面是一个简单的示例,展示了如何定义和使用…

    other 2023年8月19日
    00
  • iOS14.6正式版固件下载地址 iOS14.6正式版下载

    iOS 14.6正式版固件下载地址 iOS 14.6正式版固件是苹果公司最新发布的操作系统版本,它带来了一些新功能和改进。如果你想下载并安装iOS 14.6正式版固件,下面是一个详细的攻略。 步骤一:备份设备 在开始下载和安装iOS 14.6正式版固件之前,强烈建议你先备份你的设备。这样可以确保你的数据在升级过程中不会丢失。你可以使用iCloud或iTune…

    other 2023年8月4日
    00
  • vue将数字转为中文大写金额方式

    Vue将数字转为中文大写金额方式攻略 步骤一:创建过滤器 首先,在Vue应用中创建一个过滤器,用于将数字转换为中文大写金额的方式。在Vue组件中的filters选项中添加以下代码: filters: { toChineseAmount(value) { // 将数字转换为中文大写金额的逻辑代码 // … // 返回转换后的中文大写金额 return co…

    other 2023年8月18日
    00
  • 详解Linux 中获取硬盘分区或文件系统的 UUID 的七种方法

    下面是详解Linux中获取硬盘分区或文件系统的UUID的七种方法的完整攻略: 概述 UUID (通用唯一标识符) 是一种行业标准,用于唯一标识信息。在Linux中,我们可以使用UUID来标识硬盘分区和文件系统。获取UUID是非常有用的,特别是在自动挂载硬盘等操作中。 方法一:使用blkid命令 blkid命令可以列出设备的文件系统和UUID信息。具体操作如下…

    other 2023年6月27日
    00
  • angular中实现控制器之间传递参数的方式

    ny) { this.sharedData = data; } getSharedData() { return this.sharedData; }} ### 步骤二:在发送参数的控制器中设置参数值 在发送参数的控制器中,通过依赖注入方式引入共享服务,并使用`setSharedData`方法设置参数值。 “`typescript import { Com…

    other 2023年8月21日
    00
  • 利用DIR命令批量输出文件夹名或文件名的代码

    使用DIR命令可以批量输出指定目录下的文件夹名或文件名。以下是利用DIR命令批量输出文件夹名或文件名的完整攻略: 1. 打开命令行窗口 在Windows系统中,按下“Win+R”快捷键打开运行窗口,输入“cmd”并点击“确定”即可打开命令行窗口。 2. 定位到指定目录 使用CD命令可以切换当前目录,例如“CD D:\test”表示切换到D盘下的test文件夹…

    other 2023年6月26日
    00
  • Docker容器的加载分层原理及commit镜像

    Docker是一种虚拟化技术,它能够将应用程序和它们的依赖项打包成一个镜像,然后运行在一个独立的 Docker 容器中。Docker 容器的加载分层原理和commit镜像是 Docker 技术的基础,掌握了这些技术,能更好地理解 Docker 的工作原理和使用方式。 Docker容器的加载分层原理 Docker 镜像是分层的,每一层都包含了一个应用程序或其它…

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