Java LinkedList

Java集合框架中的LinkedList类提供了链表数据结构(双向链表)的功能。

A single node of doubly linkedlist that has 3 fields Prev, Data, and Next.
Java双向链表

链表中的每个元素都称为一个**节点**。它包含 3 个字段:

  • **Prev** - 存储列表中前一个元素的地址。对于第一个元素,它为null
  • **Next** - 存储列表中下一个元素的地址。对于最后一个元素,它为null
  • **Data** - 存储实际数据。

创建Java LinkedList

以下是在Java中创建链表的方法:

LinkedList<Type> linkedList = new LinkedList<>();

在此,Type表示链表的类型。例如:

// create Integer type linked list
LinkedList<Integer> linkedList = new LinkedList<>();

// create String type linked list
LinkedList<String> linkedList = new LinkedList<>();

示例:在Java中创建LinkedList

import java.util.LinkedList;

class Main {
  public static void main(String[] args){

    // create linkedlist
    LinkedList<String> animals = new LinkedList<>();

    // Add elements to LinkedList
    animals.add("Dog");
    animals.add("Cat");
    animals.add("Cow");
    System.out.println("LinkedList: " + animals);
  }
}

输出

LinkedList: [Dog, Cat, Cow]

在上面的示例中,我们创建了一个名为animalsLinkedList

在这里,我们使用了add()方法向LinkedList添加元素。我们将在本教程后面详细介绍add()方法。


Java LinkedList的工作原理

链表中的元素不是按顺序存储的。相反,它们被分散开,并通过链接(**Prev**和**Next**)连接。

3 linkedlist nodes each connecting to one another using pointers
Java LinkedList实现

这里我们在链表中包含 3 个元素:

  • Dog - 它是第一个元素,其前向地址为null,后向地址为Cat的地址。
  • Cat - 它是第二个元素,其前向地址为Dog的地址,后向地址为Cow的地址。
  • Cow - 它是最后一个元素,其前向地址为Cat的地址,后向地址为null

如需了解更多信息,请访问LinkedList数据结构


Java LinkedList的方法

LinkedList提供了多种方法,可用于在链表中执行各种操作。在本教程中,我们将介绍四种最常用的LinkedList运算符:

  • 添加元素
  • 访问元素
  • 更改元素
  • 删除元素

1. 向LinkedList添加元素

我们可以使用add()方法将元素(节点)添加到LinkedList的末尾。例如:

import java.util.LinkedList;

class Main {
  public static void main(String[] args){
    // create linkedlist
    LinkedList<String> animals = new LinkedList<>();

    // add() method without the index parameter
    animals.add("Dog");
    animals.add("Cat");
    animals.add("Cow");
    System.out.println("LinkedList: " + animals);

    // add() method with the index parameter
    animals.add(1, "Horse");
    System.out.println("Updated LinkedList: " + animals);
  }
}

输出

LinkedList: [Dog, Cat, Cow]
Updated LinkedList: [Dog, Horse, Cat, Cow]

在上面的示例中,我们创建了一个名为animals的LinkedList。在这里,我们使用了add()方法向animals添加元素。

请注意以下语句:

animals.add(1, "Horse");

这里,我们使用了**索引号**参数。这是一个可选参数,指定添加新元素的位置。

要了解有关向LinkedList添加元素的更多信息,请访问Java程序向LinkedList添加元素


2. 访问LinkedList元素

LinkedList类的get()方法用于从LinkedList访问元素。例如:

import java.util.LinkedList;

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

    // add elements in the linked list
    languages.add("Python");
    languages.add("Java");
    languages.add("JavaScript");
    System.out.println("LinkedList: " + languages);

    // get the element from the linked list
    String str = languages.get(1);
    System.out.print("Element at index 1: " + str);
  }
}

输出

LinkedList: [Python, Java, JavaScript]
Element at index 1: Java

在上面的示例中,我们使用了带有参数**1**的get()方法。这里,该方法返回索引**1**处的元素。

我们还可以使用iterator()listIterator()方法访问LinkedList的元素。要了解更多信息,请访问Java程序访问LinkedList的元素


3. 更改LinkedList的元素

LinkedList类的set()方法用于更改LinkedList的元素。例如:

import java.util.LinkedList;

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

    // add elements in the linked list
    languages.add("Java");
    languages.add("Python");
    languages.add("JavaScript");
    languages.add("Java");
    System.out.println("LinkedList: " + languages);

    // change elements at index 3
    languages.set(3, "Kotlin");
    System.out.println("Updated LinkedList: " + languages);
  }
}

输出

LinkedList: [Java, Python, JavaScript, Java]
Updated LinkedList: [Java, Python, JavaScript, Kotlin]

在上面的示例中,我们创建了一个名为languages的LinkedList。请注意以下行:

languages.set(3, "Kotlin");

这里,set()方法将索引**3**处的元素更改为Kotlin


4. 从LinkedList中删除元素

LinkedList类的remove()方法用于从LinkedList中删除元素。例如:

import java.util.LinkedList;

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

    // add elements in LinkedList
    languages.add("Java");
    languages.add("Python");
    languages.add("JavaScript");
    languages.add("Kotlin");
    System.out.println("LinkedList: " + languages);

    // remove elements from index 1
    String str = languages.remove(1);
    System.out.println("Removed Element: " + str);

    System.out.println("Updated LinkedList: " + languages);
  }
}

输出

LinkedList: [Java, Python, JavaScript, Kotlin]
Removed Element: Python
New LinkedList: [Java, JavaScript, Kotlin]

这里,remove()方法将索引号作为参数。它会删除由索引号指定的元素。

要了解有关从LinkedList中删除元素的更多信息,请访问Java程序删除LinkedList的元素。


其他方法

方法 描述
contains() 检查LinkedList是否包含该元素
indexOf() 返回元素第一次出现的索引
lastIndexOf() 返回元素最后一次出现的索引
clear() 删除LinkedList的所有元素
iterator() 返回一个迭代器以遍历LinkedList

LinkedList作为Deque和Queue

由于LinkedList类还实现了QueueDeque接口,因此它也可以实现这些接口的方法。以下是一些常用方法:

方法 描述
addFirst() 将指定的元素添加到链表的开头
addLast() 将指定的元素添加到链表的末尾
getFirst() 返回第一个元素
getLast() 返回最后一个元素
removeFirst() 删除第一个元素
removeLast() 删除最后一个元素
peek() 返回链表的第一个元素(头)
poll() 返回并删除链表的第一个元素
offer() 将指定的元素添加到链表的末尾

示例:Java LinkedList作为Queue

import java.util.LinkedList;
import java.util.Queue;

class Main {
  public static void main(String[] args) {
    Queue<String> languages = new LinkedList<>();

    // add elements
    languages.add("Python");
    languages.add("Java");
    languages.add("C");
    System.out.println("LinkedList: " + languages);

    // access the first element
    String str1 = languages.peek();
    System.out.println("Accessed Element: " + str1);

    // access and remove the first element
    String str2 = languages.poll();
    System.out.println("Removed Element: " + str2);
    System.out.println("LinkedList after poll(): " + languages);

    // add element at the end
    languages.offer("Swift");
    System.out.println("LinkedList after offer(): " + languages);
  }
}

输出

LinkedList: [Python, Java, C]
Accessed Element: Python
Removed Element: Python
LinkedList after poll(): [Java, C]
LinkedList after offer(): [Java, C, Swift]

示例:LinkedList作为Deque

import java.util.LinkedList;
import java.util.Deque;

class Main {
  public static void main(String[] args){
    Deque<String> animals = new LinkedList<>();

    // add element at the beginning
    animals.add("Cow");
    System.out.println("LinkedList: " + animals);

    animals.addFirst("Dog");
    System.out.println("LinkedList after addFirst(): " + animals);

    // add elements at the end
    animals.addLast("Zebra");
    System.out.println("LinkedList after addLast(): " + animals);

    // remove the first element
    animals.removeFirst();
    System.out.println("LinkedList after removeFirst(): " + animals);

    // remove the last element
    animals.removeLast();
    System.out.println("LinkedList after removeLast(): " + animals);
  }
}

输出

LinkedList: [Cow]
LinkedList after addFirst(): [Dog, Cow]
LinkedList after addLast(): [Dog, Cow, Zebra]
LinkedList after removeFirst(): [Cow, Zebra]
LinkedList after removeLast(): [Cow]

遍历LinkedList

我们可以使用Java for-each循环来遍历LinkedList。例如:

import java.util.LinkedList;

class Main {
    public static void main(String[] args) {
        // Creating a linked list
        LinkedList<String> animals = new LinkedList<>();
        animals.add("Cow");
        animals.add("Cat");
        animals.add("Dog");
        System.out.println("LinkedList: " + animals);

        // Using forEach loop
        System.out.println("Accessing linked list elements:");
        for(String animal: animals) {
            System.out.print(animal);
            System.out.print(", ");
        }
    }
}

输出

LinkedList: [Cow, Cat, Dog]
Accessing linked list elements:
Cow, Cat, Dog,

LinkedList 与 ArrayList 对比

Java ArrayList和LinkedList都实现了Collections框架的List接口。但是,它们之间存在一些差异。

LinkedList ArrayList
实现了ListQueueDeque接口。 实现了List接口。
在单个位置存储 3 个值(**前向地址**、**数据**和**后向地址**)。 在单个位置存储单个值。
提供双向链表实现。 提供可调整大小的数组实现。
添加元素时,会更改prevnext地址。 添加元素时,会移动该位置之后的所有元素。
要访问元素,需要从头开始迭代到该元素。 可以通过索引随机访问元素。

注意:我们也可以使用接口在Java中创建LinkedList。例如:

// create linkedlist using List
List<String> animals1 = new LinkedList<>();

// creating linkedlist using Queue
Queue<String> animals2 = new LinkedList<>();

// creating linkedlist using Deque
Deque<String> animals3 = new LinkedList<>();

在这里,如果LinkedList是通过一个接口创建的,那么我们就不能使用其他接口提供的特定方法。也就是说,animals1不能使用QueueDeque接口特有的方法。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战