链表-JAVA实现

140 阅读3分钟

Java语言实现链表数据结构。

  1. 什么是链表

链表是一种常见的数据结构,它可以用于存储一组有序的数据,同时还支持插入、删除、查找等操作。链表中的每个元素称为节点(Node),每个节点包含两个部分:数据和指针。其中,数据用于存储节点的值,指针用于指向下一个节点。

  1. 链表的实现

在Java中,我们可以使用类来实现链表。下面是一个简单的链表类定义:

javaCopy code
public class LinkedList<T> {
    private Node<T> head;
    private int size;

    private static class Node<T> {
        T value;
        Node<T> next;

        Node(T value) {
            this.value = value;
            this.next = null;
        }
    }

    public LinkedList() {
        this.head = null;
        this.size = 0;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return head == null;
    }

    public void addFirst(T value) {
        Node<T> node = new Node<>(value);
        node.next = head;
        head = node;
        size++;
    }

    public void addLast(T value) {
        Node<T> node = new Node<>(value);
        if (head == null) {
            head = node;
        } else {
            Node<T> current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = node;
        }
        size++;
    }

    public T removeFirst() {
        if (head == null) {
            throw new NoSuchElementException();
        }
        T value = head.value;
        head = head.next;
        size--;
        return value;
    }

    public T removeLast() {
        if (head == null) {
            throw new NoSuchElementException();
        }
        if (head.next == null) {
            T value = head.value;
            head = null;
            size--;
            return value;
        }
        Node<T> current = head;
        while (current.next.next != null) {
            current = current.next;
        }
        T value = current.next.value;
        current.next = null;
        size--;
        return value;
    }

    public boolean contains(T value) {
        Node<T> current = head;
        while (current != null) {
            if (current.value.equals(value)) {
                return true;
            }
            current = current.next;
        }
        return false;
    }

    public void clear() {
        head = null;
        size = 0;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        Node<T> current = head;
        while (current != null) {
            sb.append(current.value);
            if (current.next != null) {
                sb.append(", ");
            }
            current = current.next;
        }
        sb.append("]");
        return sb.toString();
    }
}

在上面的代码中,我们使用泛型来定义了一个链表类LinkedList<T>,其中T表示节点的数据类型。链表类包含一个节点类Node<T>,每个节点包含了节点的值value和指向下一个节点的指针next

  1. 链表的适用场景

链表的一个主要优点是它可以高效地进行插入和删除操作,因为链表中的节点可以非常快速地添加或删除,只需要修改指针即可。此外,链表还可以动态地调整大小,因此非常适合用于动态数据的存储和操作。例如,当需要对数据进行频繁的插入或删除操作时,链表可能是比较合适的数据结构选择。

但是,链表也有一些缺点。链表中的元素不是按顺序存储的,因此无法对元素进行随机访问,必须遍历整个链表才能找到需要的元素。此外,链表中的每个节点都需要额外的指针空间,这可能会导致链表占用更多的内存空间。

  1. 链表的示例应用

下面是一个简单的示例,使用链表来实现一个字符串的反转。假设我们有一个字符串"hello world",现在想要将其反转为"dlrow olleh",可以使用下面的代码来实现:

javaCopy code
public class LinkedListExample {
    public static void main(String[] args) {
        String str = "hello world";
        LinkedList<Character> list = new LinkedList<>();
        for (int i = 0; i < str.length(); i++) {
            list.addFirst(str.charAt(i));
        }
        System.out.println(list);
    }
}

在上面的代码中,我们首先创建了一个字符串"hello world",然后创建了一个链表list,并将字符串中的每个字符添加到链表的头部。最后,我们使用System.out.println()方法打印出了反转后的字符串。

  1. 总结

链表是一种常见的数据结构,它可以用于存储一组有序的数据,并支持插入、删除、查找等操作。在Java中,我们可以使用类来实现链表,利用它的动态调整大小、高效插入删除等优点。但是,链表也有一些缺点,例如无法随机访问和占用更多的内存空间。在实际应用中,我们需要根据具体情况选择合适的数据结构。