数据结构奇妙旅程之线性表

线性表(Linear List)是数据结构中的一种基本类型,它代表了具有相同类型数据元素的一个有限序列。线性表中的数据元素之间是一对一的关系,即除了第一个元素外,每个元素有且仅有一个前驱元素;除了最后一个元素外,每个元素有且仅有一个后继元素。数据元素间的线性关系是一对一的关系。

线性表在Java中可以通过多种方式实现,最常见的是使用数组(Array)和链表(LinkedList)。下面分别介绍这两种实现方式及其代码。

1. 数组实现的线性表

数组是线性表的一种顺序存储结构,它使用一段地址连续的存储单元依次存储线性表的数据元素。

java 复制代码
public class ArrayList<T> {
    private T[] elements;
    private int size;
    private static final int DEFAULT_CAPACITY = 10;

    @SuppressWarnings("unchecked")
    public ArrayList() {
        this.elements = (T[]) new Object[DEFAULT_CAPACITY];
        this.size = 0;
    }

    public void add(T element) {
        if (size == elements.length) {
            resize();
        }
        elements[size++] = element;
    }

    private void resize() {
        T[] newElements = (T[]) new Object[elements.length * 2];
        System.arraycopy(elements, 0, newElements, 0, size);
        elements = newElements;
    }

    public T get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return elements[index];
    }

    public int size() {
        return size;
    }

    // 其他方法,如删除、修改等...
}

这个简单的ArrayList类使用泛型T来存储任意类型的元素,并维护一个数组elements来存储数据。add方法用于向线性表中添加元素,如果当前数组已满,则通过resize方法扩大数组容量。get方法用于获取指定索引位置的元素。size方法返回线性表中元素的数量。

2. 链表实现的线性表

链表是线性表的链式存储结构,用一组任意的存储单元来存放线性表的元素。为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,对数据元素除了存放其本身的信息外,还需存放一个指示其直接后继的信息(即直接后继的存储位置)。

java 复制代码
public class Node<T> {
    T data;
    Node<T> next;

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

public class LinkedList<T> {
    private Node<T> head;
    private int size;

    public LinkedList() {
        this.head = null;
        this.size = 0;
    }

    public void add(T element) {
        Node<T> newNode = new Node<>(element);
        if (head == null) {
            head = newNode;
        } else {
            Node<T> current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
        size++;
    }

    public T get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        Node<T> current = head;
        for (int i = 0; i < index; i++) {
            current = current.next;
        }
        return current.data;
    }

    public int size() {
        return size;
    }

    // 其他方法,如删除、修改等...
}

在这个LinkedList类中,我们定义了一个内部类Node来存储数据和指向下一个节点的引用。add方法用于向链表的末尾添加新元素,而get方法则通过遍历链表来找到指定索引位置的元素。size方法返回链表中元素的数量。

使用示例

java 复制代码
public class Main {
    public static void main(String[] args) {
        // 使用数组实现的线性表
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("Element 1");
        arrayList.add("Element 2");
        
相关推荐
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-13 日K蜡烛图(C语言实现)
c语言·开发语言·数据结构·算法
夜不会漫长3 小时前
数据结构:栈和队列(1)
数据结构
青山木4 小时前
Hot 100 --- 电话号码的字母组合
java·数据结构·算法·leetcode·逻辑回归
闪电悠米5 小时前
力扣hot100-240.搜索二维矩阵2-单调性剪枝详解
数据结构·算法·leetcode·矩阵·哈希算法
雨落在了我的手上5 小时前
Java数据结构(九):栈和队列
java·开发语言·数据结构
春生野草6 小时前
个人笔记--大顶堆和基数排序
java·数据结构·算法
paeamecium8 小时前
【PAT甲级真题】- Rational Sum (20)
数据结构·c++·python·算法·pat考试·pat
Highcharts.js14 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
稚南城才子,乌衣巷风流20 小时前
动态开点:原理、实现与应用场景
数据结构·算法
yyds_yyd_1008620 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode