Java单链表的创建

1. 引言

单链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。相比于数组,单链表在插入和删除操作上有更好的性能,但在访问元素时效率较低。本文将介绍如何使用Java语言创建和操作单链表,并给出相应的代码示例。

2. 单链表的定义

单链表是一种递归的数据结构,它由若干个节点组成。每个节点包含两部分信息:数据域和指针域。数据域存储节点的数据,指针域存储指向下一个节点的指针。

单链表使用一个头节点来指向链表的第一个节点,当链表为空时,头节点的指针域为空。当链表不为空时,头节点的指针域指向第一个节点。

下图是一个单链表的示意图:

erDiagram
    HEAD_NODE ||--o FIRST_NODE : next
    FIRST_NODE ||--o SECOND_NODE : next
    SECOND_NODE ||--o THIRD_NODE : next
    THIRD_NODE ||--o NULL

3. Java单链表的实现

3.1 节点类的定义

首先,我们需要定义一个节点类来表示单链表中的每个节点,该类包含数据和指向下一个节点的指针。

public class Node {
    public int data;
    public Node next;
}

3.2 单链表类的定义

接下来,我们需要定义一个单链表类来实现单链表的各种操作。

public class LinkedList {
    private Node head;

    public LinkedList() {
        head = null;
    }

    // 在链表头部插入一个节点
    public void insertAtHead(int data) {
        Node newNode = new Node();
        newNode.data = data;
        newNode.next = head;
        head = newNode;
    }

    // 在链表尾部插入一个节点
    public void insertAtTail(int data) {
        Node newNode = new Node();
        newNode.data = data;
        newNode.next = null;

        if (head == null) {
            head = newNode;
            return;
        }

        Node current = head;
        while (current.next != null) {
            current = current.next;
        }
        current.next = newNode;
    }

    // 在指定位置插入一个节点
    public void insertAtPosition(int data, int position) {
        Node newNode = new Node();
        newNode.data = data;

        if (position == 1) {
            newNode.next = head;
            head = newNode;
            return;
        }

        Node previous = head;
        int counter = 1;
        while (counter < position - 1 && previous.next != null) {
            previous = previous.next;
            counter++;
        }

        if (previous == null) {
            System.out.println("Position out of range");
            return;
        }

        newNode.next = previous.next;
        previous.next = newNode;
    }

    // 删除链表头部节点
    public void deleteAtHead() {
        if (head == null) {
            return;
        }

        head = head.next;
    }

    // 删除链表尾部节点
    public void deleteAtTail() {
        if (head == null || head.next == null) {
            head = null;
            return;
        }

        Node previous = null;
        Node current = head;
        while (current.next != null) {
            previous = current;
            current = current.next;
        }
        previous.next = null;
    }

    // 删除指定位置的节点
    public void deleteAtPosition(int position) {
        if (position == 1) {
            head = head.next;
            return;
        }

        Node previous = head;
        int counter = 1;
        while (counter < position - 1 && previous.next != null) {
            previous = previous.next;
            counter++;
        }

        if (previous.next == null) {
            System.out.println("Position out of range");
            return;
        }

        previous.next = previous.next.next;
    }

    // 打印链表中的所有节点
    public void printList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }
}

4. 单链表的操作示例

下面是一些使用Java单链表的示例操作:

public class Main {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();

        list.insertAtHead(3