线性表(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");