java数据结构基础:线性表

Java数据结构基础:线性表

简介

线性表是指数据元素之间存在线性关系的数据结构,即数据元素之间有前后直接关系,且第一个元素没有前驱,最后一个元素没有后继。线性表可以用数组或者链表两种方式实现。

数组实现线性表

线性表的数组实现即为将线性表中的元素放在一个一维数组中,使用数组下标表示元素的位置。由于数组随机访问元素的时间复杂度为O(1),因此在随机访问比较多的情况下,使用数组实现线性表会更加高效。

Java代码示例:

public class ArrayLinearList<T> implements LinearList<T> {
    private int maxLength; //数组最大长度
    private int length; //线性表当前长度
    private Object[] element; //线性表存储元素的数组

    public ArrayLinearList(int maxLength) {
        this.maxLength = maxLength;
        element = new Object[maxLength];
        length = 0;
    }

    // 获取线性表长度
    @Override
    public int size() {
        return length;
    }

    // 判断线性表是否为空
    @Override
    public boolean isEmpty() {
        return length == 0;
    }

    // 在线性表的第i个位置插入元素
    @Override
    public void insert(int i, T t) throws Exception {
        if (length == maxLength) {
            throw new Exception("线性表已满,无法插入元素!");
        }
        if (i < 1 || i > length + 1) {
            throw new Exception("插入位置不合法!");
        }
        // 将元素依次向后移动一位
        for (int j = length; j >= i; j--) {
            element[j] = element[j - 1];
        }
        element[i - 1] = t;
        length++;
    }

    // 删除线性表中第i个元素
    @Override
    public void delete(int i) throws Exception {
        if (isEmpty()) {
            throw new Exception("线性表为空,无法删除元素!");
        }
        if (i < 1 || i > length) {
            throw new Exception("删除位置不合法!");
        }
        // 将元素依次向前移动一位
        for (int j = i - 1; j < length - 1; j++) {
            element[j] = element[j + 1];
        }
        element[length - 1] = null;
        length--;
    }

    // 获取线性表中第i个元素的值
    @Override
    public T get(int i) throws Exception {
        if (i < 1 || i > length) {
            throw new Exception("获取位置不合法!");
        }
        return (T) element[i - 1];
    }
}

链表实现线性表

链表实现线性表即为将线性表中的元素分别存储在不同的结点中,并通过指针将这些结点相连组成链表。由于链表需要遍历到目标元素的前一个结点才能对目标元素进行插入、删除、修改等操作,因此在插入、删除、修改等频繁操作的场景中,使用链表实现线性表会更加高效。

Java代码示例:

public class LinkedLinearList<T> implements LinearList<T> {
    // 结点类
    private class Node {
        private T data; // 结点存储的数据
        private Node next; // 下一个结点

        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

    private Node head; // 头结点
    private int length; // 线性表长度

    public LinkedLinearList() {
        head = new Node(null, null);
        length = 0;
    }

    // 获取线性表长度
    @Override
    public int size() {
        return length;
    }

    // 判断线性表是否为空
    @Override
    public boolean isEmpty() {
        return length == 0;
    }

    // 在线性表的第i个位置插入元素
    @Override
    public void insert(int i, T t) throws Exception {
        if (i < 1 || i > length + 1) {
            throw new Exception("插入位置不合法!");
        }
        Node p = head;
        // 寻找插入位置的前一个结点
        for (int j = 1; j < i; j++) {
            p = p.next;
        }
        Node newNode = new Node(t, p.next);
        p.next = newNode;
        length++;
    }

    // 删除线性表中第i个元素
    @Override
    public void delete(int i) throws Exception {
        if (isEmpty()) {
            throw new Exception("线性表为空,无法删除元素!");
        }
        if (i < 1 || i > length) {
            throw new Exception("删除位置不合法!");
        }
        Node p = head;
        // 寻找删除位置的前一个结点
        for (int j = 1; j < i; j++) {
            p = p.next;
        }
        p.next = p.next.next;
        length--;
    }

    // 获取线性表中第i个元素的值
    @Override
    public T get(int i) throws Exception {
        if (i < 1 || i > length) {
            throw new Exception("获取位置不合法!");
        }
        Node p = head.next;
        // 寻找第i个结点
        for (int j = 1; j < i; j++) {
            p = p.next;
        }
        return p.data;
    }
}

两种实现方式各有优缺点,可以根据具体的需求来选择合适的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java数据结构基础:线性表 - Python技术站

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

相关文章

  • SQL Injection with MySQL 注入分析

    SQL Injection (SQL注入)是一种常见的网络攻击技术,攻击者通过输入一定格式的恶意SQL语句,利用程序没有对用户输入进行校验或者过滤的漏洞,来获取数据库中的数据或者执行非授权的操作。本文将针对MySQL数据库漏洞进行讲解,介绍常见的攻击方法和防御策略。 SQL Injection with MySQL 注入分析 攻击方法 错误的输入验证 攻击者…

    数据结构 2023年5月17日
    00
  • 数据结构 栈的操作实例详解

    数据结构 栈的操作实例详解 什么是栈? 栈(stack)是一种具有特殊限制的线性数据结构。它只允许在表的一端进行插入和删除操作,另一端是固定的,称为栈底;相反的另一端称为栈顶。栈底用于存放最早进入的元素,栈顶用于存放最近进入的元素,所以栈又称为后进先出的数据结构。 栈的操作 栈的主要操作包括入栈(push)、出栈(pop)、获取栈顶元素(top)和判断栈是否…

    数据结构 2023年5月17日
    00
  • C++数据结构二叉搜索树的实现应用与分析

    C++数据结构二叉搜索树的实现应用与分析 什么是二叉搜索树? 二叉搜索树(Binary Search Tree,BST),也称二叉查找树、二叉排序树,它是一种特殊的二叉树。对于每个节点,其左子树上所有节点的值均小于等于该节点的值,右子树上所有节点的值均大于等于该节点的值。通过这种特殊的结构,二叉搜索树能够帮助我们快速地执行查找、插入、删除等操作。 如何实现二…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的建立实例

    下面是Python数据结构之二叉树的建立实例的完整攻略。 一、二叉树的概念 二叉树是一种常用的树形结构,它由一组父子关系组成,其中每个节点都最多有两个子节点。通常我们认为,一个二叉树的根节点是唯一的,它没有父节点,而叶子节点则没有子节点。在二叉树中,节点的左子树和右子树可以为空。 二、二叉树的遍历 二叉树的遍历是指访问二叉树中所有节点的操作,它分为三种不同的…

    数据结构 2023年5月17日
    00
  • JS数据结构之队列结构详解

    JS数据结构之队列结构详解 什么是队列结构? 队列结构是一种遵循先进先出(FIFO)原则的线性数据结构,它可以用来存储一系列待处理的数据,其中队首是最先进入队列的元素,队尾是最后进入队列的元素。 在队列中,添加元素的操作叫做enqueue,移除元素的操作叫做dequeue。同时,队列还包括peek方法,查看队列头的元素,以及isEmpty方法,判断队列是否为…

    数据结构 2023年5月17日
    00
  • C++数据结构之双向链表

    C++数据结构之双向链表完整攻略 1. 什么是双向链表 双向链表是一种特殊的链表结构,每个节点拥有两个指针域,分别指向前继和后继节点。 双向链表不需要像单向链表那样从头到尾遍历整个链表,可以通过前后指针直接访问前后节点,提高了查找、删除、插入等操作的效率。 双向链表有一些常用的操作,如插入节点、删除节点、查找节点等。 2. 双向链表的实现 2.1 节点定义 …

    数据结构 2023年5月17日
    00
  • 数位dp

    数位dp 思想 一般来说,题目是要求在区间\([l,r]\)中符合某一种条件的数的个数 我们用前缀和的思想考虑,分别求出\([1,r]\)和\([1,l-1]\)中数的个数相减即为所求 这里采用记忆化搜索的方式实现 模板 #include<iostream> #include<cstring> #include<vector&g…

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