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

线性表(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");
        
相关推荐
夏末秋也凉31 分钟前
力扣-回溯-46 全排列
数据结构·算法·leetcode
王老师青少年编程37 分钟前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
liuyuzhongcc4 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list
计算机小白一个5 小时前
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
java·数据结构·蓝桥杯
卑微的小鬼5 小时前
数据库使用B+树的原因
数据结构·b树
cookies_s_s6 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
醉城夜风~7 小时前
[数据结构]双链表详解
数据结构
gyeolhada8 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~8 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
刃神太酷啦9 小时前
堆和priority_queue
数据结构·c++·蓝桥杯c++组