Java学习教程,从入门到精通,Java LinkedList(链表)语法知识点及案例代码(62)

发布于:2024-12-18 ⋅ 阅读:(8) ⋅ 点赞:(0)

Java LinkedList(链表)语法知识点及案例代码

一、LinkedList概述

LinkedList是Java集合框架中的一个类,位于java.util包中。它实现了List、Deque、Queue等接口,提供了链表数据结构的实现。链表是一种线性数据结构,其中每个元素都是一个节点,节点包含数据和指向下一个节点的引用。LinkedList是一个双向链表,每个节点除了指向下一个节点外,还指向前一个节点。

二、LinkedList的特点
  • 动态大小:链表的大小是动态变化的,不需要预先分配固定大小的内存。
  • 高效的插入和删除操作:在链表中间进行插入和删除操作的时间复杂度为O(1)(在已知节点位置的情况下)。
  • 随机访问效率低:访问链表中任意位置的元素需要从头开始遍历,时间复杂度为O(n)。
三、LinkedList的常见方法
  1. 构造方法

    • LinkedList():创建一个空的LinkedList。
    • LinkedList(Collection<? extends E> c):使用指定的集合来创建LinkedList。
  2. 添加元素

    • void add(E e):在链表末尾添加元素。
    • void add(int index, E element):在链表的指定位置插入元素。
    • void addFirst(E e):在链表的开头添加元素。
    • void addLast(E e):在链表的末尾添加元素。
  3. 删除元素

    • E remove():删除并返回链表的第一个元素。
    • E remove(int index):删除链表中指定位置的元素。
    • boolean remove(Object o):删除链表中指定的元素(如果存在)。
    • E removeFirst():删除并返回链表的第一个元素。
    • E removeLast():删除并返回链表的最后一个元素。
  4. 访问元素

    • E get(int index):返回链表中指定位置的元素。
    • E getFirst():返回链表的第一个元素。
    • E getLast():返回链表的最后一个元素。
  5. 检查元素

    • boolean contains(Object o):检查链表中是否包含指定的元素。
  6. 查找元素位置

    • int indexOf(Object o):返回链表中第一次出现指定元素的索引位置。
    • int lastIndexOf(Object o):返回链表中最后一次出现指定元素的索引位置。
  7. 其他方法

    • int size():返回链表中元素的数量。
    • void clear():清空链表中的所有元素。
    • boolean isEmpty():检查链表是否为空。
    • Iterator<E> iterator():返回链表的迭代器。
    • ListIterator<E> listIterator():返回链表的列表迭代器。
    • ListIterator<E> listIterator(int index):返回从指定位置开始的列表迭代器。
四、案例代码

以下是一个简单的Java程序,展示了如何使用LinkedList及其常见方法。

import java.util.LinkedList;
import java.util.Iterator;
import java.util.ListIterator;

public class LinkedListExample {
    public static void main(String[] args) {
        // 创建一个LinkedList对象
        LinkedList<String> linkedList = new LinkedList<>();

        // 添加元素到链表末尾
        linkedList.add("苹果");
        linkedList.add("香蕉");
        linkedList.add("橙子");

        // 在指定位置插入元素
        linkedList.add(1, "葡萄");

        // 访问元素
        String fruit = linkedList.get(2);
        System.out.println("索引为2的元素: " + fruit); // 输出: 索引为2的元素: 葡萄

        // 删除元素
        String removedFruit = linkedList.remove(0);
        System.out.println("移除的元素: " + removedFruit); // 输出: 移除的元素: 苹果

        // 获取链表的大小
        int size = linkedList.size();
        System.out.println("大小: " + size); // 输出: 大小: 3

        // 检查链表是否为空
        boolean empty = linkedList.isEmpty();
        System.out.println("是否为空: " + empty); // 输出: 是否为空: false

        // 检查链表是否包含指定元素
        boolean contains = linkedList.contains("香蕉");
        System.out.println("是否包含香蕉: " + contains); // 输出: 是否包含香蕉: true

        // 使用Iterator遍历
        Iterator<String> iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        // 使用ListIterator遍历和修改
        ListIterator<String> listIterator = linkedList.listIterator();
        while (listIterator.hasNext()) {
            String element = listIterator.next();
            if (element.equals("葡萄")) {
                listIterator.set("草莓"); // 修改元素
            }
        }
        // 输出修改后的链表
        System.out.println("修改后的链表: " + linkedList); // 输出: 修改后的链表: [香蕉, 草莓, 橙子]

        // 清空链表
        linkedList.clear();
        System.out.println("清空后的链表是否为空: " + linkedList.isEmpty()); // 输出: 清空后的链表是否为空: true
    }
}
五、总结

LinkedList是一个强大的数据结构,适用于在列表中间频繁进行插入和删除操作的场景。通过掌握其常见方法和特点,可以更加高效地处理链表相关的编程问题。

当然可以,以下是一些关于Java中LinkedList的具体案例,涵盖了LinkedList的构造、元素增删、查找、遍历等操作:

案例一:LinkedList的基本构造与元素增删

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // 构造一个空的LinkedList
        LinkedList<Integer> list = new LinkedList<>();

        // 尾插法添加元素
        list.add(1);
        list.add(2);
        list.add(3);

        // 在指定位置插入元素
        list.add(1, 4); // 在索引1的位置插入4

        // 删除元素
        list.remove(2); // 删除索引为2的元素,即3
        list.removeFirst(); // 删除第一个元素,即1
        list.removeLast(); // 删除最后一个元素

        // 打印链表内容
        System.out.println(list); // 输出:[4]
    }
}

案例二:LinkedList的查找与修改

import java.util.LinkedList;

public class LinkedListSearchAndModify {
    public static void main(String[] args) {
        // 构造一个LinkedList并添加元素
        LinkedList<String> list = new LinkedList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");
        // 查找元素
        int index = list.indexOf("banana"); // 查找"banana"的索引位置
        if (index != -1) {
            System.out.println("banana的索引位置是:" + index);
        } else {
            System.out.println("未找到元素banana");
        }

        // 修改元素
        list.set(1, "blueberry"); // 将索引为1的元素修改为"blueberry"

        // 打印链表内容
        System.out.println(list); // 输出:[apple, blueberry, cherry]
    }
}

案例三:LinkedList的遍历

import java.util.LinkedList;
import java.util.Iterator;
import java.util.ListIterator;
public class LinkedListIteration {
    public static void main(String[] args) {
        // 构造一个LinkedList并添加元素
        LinkedList<String> list = new LinkedList<>();
        list.add("dog");
        list.add("cat");
        list.add("bird");

        // 使用普通for循环遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        // 使用增强for循环遍历
        for (String element : list) {
            System.out.println(element);
        }
        // 使用Iterator遍历
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        // 使用ListIterator遍历,并演示反向遍历
        ListIterator<String> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            System.out.println(listIterator.next());
        }
        System.out.println("反向遍历:");
        while (listIterator.hasPrevious()) {
            System.out.println(listIterator.previous());
        }
    }
}

案例四:LinkedList作为队列使用

import java.util.LinkedList;

public class LinkedListAsQueue {
    public static void main(String[] args) {
        // 构造一个空的LinkedList作为队列
        LinkedList<String> queue = new LinkedList<>();
        // 入队操作
        queue.addLast("task1");
        queue.addLast("task2");
        queue.addLast("task3");
        // 出队操作并打印
        System.out.println(queue.removeFirst()); // 输出:task1
        System.out.println(queue.pollFirst()); // 输出:task2,pollFirst在队列为空时返回null,避免异常
        // 打印剩余队列内容
        System.out.println(queue); // 输出:[task3]
    }
}

这些案例展示了LinkedList在Java中的基本用法,包括构造链表、添加和删除元素、查找和修改元素、遍历链表以及将链表作为队列使用等场景。通过这些案例,可以更好地理解和掌握LinkedList的使用。