2.1 数组与链表

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对象,并向其中添加了三个节点。最后,我们打印了整个链表,输出了链表中所有节点的值。

小结

数组和链表都是非常有用的数据结构,但它们各有优点和缺点。在实际编程中,你需要根据实际需要选择使用哪种数据结构。理解这两种基础数据结构对于学习其他更复杂的数据结构非常重要,希望你能深入理解并熟练掌握它们。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosCloud2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值