2.1 数组与链表
在我们开始学习更复杂的数据结构之前,我们先来讨论两种最基础的数据结构:数组和链表。它们可以被看作是其他许多数据结构的基础。
数组
数组是最简单、最常用的数据结构之一。它是由固定数量的相同类型的元素组成的,每个元素在内存中都有一个固定的位置。我们可以通过数组的索引来快速访问和修改数组中的元素。下面是一个简单的Java数组示例:
int[] array = new int[5]; // 创建一个包含5个元素的数组
for (int i = 0; i < array.length; i++) {
array[i] = i; // 初始化数组
}
数组的优点是查询速度快,可以通过索引快速访问任何元素。但它的缺点也很明显,那就是数组的大小是固定的,一旦创建后就不能改变。
链表
与数组不同,链表并不需要连续的内存空间,它是由一组节点组成,每个节点包含一个元素和一个指向下一个节点的指针。这种结构使得链表在插入和删除元素时具有优势。以下是一个简单的Java链表示例:
LinkedList<Integer> linkedList = new LinkedList<>(); // 创建一个空链表
for (int i = 0; i < 5; i++) {
linkedList.add(i); // 向链表中添加元素
}
链表的优点是插入和删除元素的速度快,不需要移动其他元素。但它的缺点是访问速度慢,如果想访问链表中的一个元素,可能需要从头开始遍历链表。
Java 中没有直接提供链表,而是自定义类型的方式提供了双链表的实现,当然我们也可以自己手动实现,这样能更好的理解数据结构的设计方式,以下的单链表和双链表用 Java 语言的简单实现。
在 Java 中,我们可以通过创建自定义的 Node 类来实现链表。以下是一个简单的单链表实现:
public class LinkedList {
Node head; // 头节点
// 节点类
static class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null;
}
}
// 向链表添加新节点
public void add(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node last = head;
while (last.next != null) {
last = last.next;
}
last.next = newNode;
}
}
// 打印链表元素
public void printList() {
Node tempNode = head;
while (tempNode != null) {
System.out.print(tempNode.data + " ");
tempNode = tempNode.next;
}
}
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.printList(); // 输出:1 2 3
}
}
在这个例子中,我们定义了一个Node类,每个Node对象都有一个数据域和一个指向下一个节点的指针。LinkedList类中定义了一个头节点head,以及添加节点和打印链表的方法。
在Java中,双向链表可以通过自定义一个包含前后两个节点引用的节点类来实现。以下是一个简单的双向链表实现:
public class DoublyLinkedList {
Node head; // 头节点
// 节点类
static class Node {
int data;
Node prev;
Node next;
Node(int data) {
this.data = data;
}
}
// 向链表添加新节点
public void add(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node last = head;
while (last.next != null) {
last = last.next;
}
last.next = newNode;
newNode.prev = last;
}
}
// 打印链表元素
public void printList() {
Node tempNode = head;
while (tempNode != null) {
System.out.print(tempNode.data + " ");
tempNode = tempNode.next;
}
}
public static void main(String[] args) {
DoublyLinkedList doublyLinkedList = new DoublyLinkedList();
doublyLinkedList.add(1);
doublyLinkedList.add(2);
doublyLinkedList.add(3);
doublyLinkedList.printList(); // 输出:1 2 3
}
}
在这个例子中,我们定义了一个Node类,每个Node对象都有一个数据域和两个指向前后节点的引用。DoublyLinkedList类中定义了一个头节点head,以及添加节点和打印链表的方法。
在main方法中,我们创建了一个DoublyLinkedList对象,并向其中添加了三个节点。最后,我们打印了整个链表,输出了链表中所有节点的值。
在main方法中,我们创建了一个LinkedList对象,并向其中添加了三个节点。最后,我们打印了整个链表,输出了链表中所有节点的值。
小结
数组和链表都是非常有用的数据结构,但它们各有优点和缺点。在实际编程中,你需要根据实际需要选择使用哪种数据结构。理解这两种基础数据结构对于学习其他更复杂的数据结构非常重要,希望你能深入理解并熟练掌握它们。
3392

被折叠的 条评论
为什么被折叠?



