Java LinkedList: Comprehensive Guide with Examples
Java LinkedList
Discover how to harness Java’s LinkedList for efficient data manipulation, complete with practical code examples and best‑practice insights.
The LinkedList class in the Java Collections Framework implements a doubly‑linked list. Each element, or node, contains three fields:
- prev – reference to the preceding node (null for the first element)
- next – reference to the following node (null for the last element)
- data – the actual value stored in the node
Creating a Java LinkedList
Instantiate a LinkedList with a specific element type:
LinkedList<Type> list = new LinkedList<>();
Examples:
// Integer list
LinkedList<Integer> numbers = new LinkedList<>();
// String list
LinkedList<String> words = new LinkedList<>();
Example: Create LinkedList in Java
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animals = new LinkedList<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
System.out.println("LinkedList: " + animals);
}
}
Output
LinkedList: [Dog, Cat, Cow]
This code demonstrates a basic LinkedList named animals populated with three elements via add().
How a Java LinkedList Works
Unlike arrays, nodes are scattered in memory and linked together. The diagram below illustrates three nodes and their connections.

- Dog – first node, prev = null, next = Cat
- Cat – middle node, prev = Dog, next = Cow
- Cow – last node, prev = Cat, next = null
For deeper insight, see the Linked List article.
Key LinkedList Methods
Below are the most frequently used operations:
- Add elements
- Access elements
- Update elements
- Remove elements
1. Adding Elements
Use add() to append a node, optionally specifying an index:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animals = new LinkedList<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
System.out.println("LinkedList: " + animals);
animals.add(1, "Horse");
System.out.println("Updated LinkedList: " + animals);
}
}
Output
LinkedList: [Dog, Cat, Cow] Updated LinkedList: [Dog, Horse, Cat, Cow]
The second add() inserts "Horse" at index 1, shifting subsequent elements.
2. Accessing Elements
Retrieve an item by index with get():
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> languages = new LinkedList<>();
languages.add("Python");
languages.add("Java");
languages.add("JavaScript");
System.out.println("LinkedList: " + languages);
String str = languages.get(1);
System.out.print("Element at index 1: " + str);
}
}
Output
LinkedList: [Python, Java, JavaScript] Element at index 1: Java
Iteration can also be performed via iterator() or listIterator() for advanced traversal.
3. Updating Elements
Replace an element at a specific index using set():
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> languages = new LinkedList<>();
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");
languages.add("Java");
System.out.println("LinkedList: " + languages);
languages.set(3, "Kotlin");
System.out.println("Updated LinkedList: " + languages);
}
}
Output
LinkedList: [Java, Python, JavaScript, Java] Updated LinkedList: [Java, Python, JavaScript, Kotlin]
4. Removing Elements
Delete an element by index with remove():
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> languages = new LinkedList<>();
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");
languages.add("Kotlin");
System.out.println("LinkedList: " + languages);
String removed = languages.remove(1);
System.out.println("Removed Element: " + removed);
System.out.println("Updated LinkedList: " + languages);
}
}
Output
LinkedList: [Java, Python, JavaScript, Kotlin] Removed Element: Python New LinkedList: [Java, JavaScript, Kotlin]
Other Useful Methods
| Method | Description |
|---|---|
contains() | Checks if a value exists |
indexOf() | First occurrence index |
lastIndexOf() | Last occurrence index |
clear() | Removes all elements |
iterator() | Provides an Iterator |
LinkedList as Queue and Deque
Because LinkedList implements Queue and Deque, it supports FIFO and LIFO operations. Common methods include:
| Method | Description |
|---|---|
addFirst() | Add at head |
addLast() | Add at tail |
getFirst() | Peek head |
getLast() | Peek tail |
removeFirst() | Pop head |
removeLast() | Pop tail |
peek() | View head without removal |
poll() | Retrieve & remove head |
offer() | Enqueue at tail |
Example: LinkedList as Queue
import java.util.LinkedList;
import java.util.Queue;
class Main {
public static void main(String[] args){
Queue<String> languages = new LinkedList<>();
languages.add("Python");
languages.add("Java");
languages.add("C");
System.out.println("LinkedList: " + languages);
String first = languages.peek();
System.out.println("Accessed Element: " + first);
String removed = languages.poll();
System.out.println("Removed Element: " + removed);
System.out.println("LinkedList after poll(): " + languages);
languages.offer("Swift");
System.out.println("LinkedList after offer(): " + languages);
}
}
Output
LinkedList: [Python, Java, C] Accessed Element: Python Removed Element: Python LinkedList after poll(): [Java, C] LinkedList after offer(): [Java, C, Swift]
Example: LinkedList as Deque
import java.util.LinkedList;
import java.util.Deque;
class Main {
public static void main(String[] args){
Deque<String> animals = new LinkedList<>();
animals.add("Cow");
System.out.println("LinkedList: " + animals);
animals.addFirst("Dog");
System.out.println("LinkedList after addFirst(): " + animals);
animals.addLast("Zebra");
System.out.println("LinkedList after addLast(): " + animals);
animals.removeFirst();
System.out.println("LinkedList after removeFirst(): " + animals);
animals.removeLast();
System.out.println("LinkedList after removeLast(): " + animals);
}
}
Output
LinkedList: [Cow] LinkedList after addFirst(): [Dog, Cow] LinkedList after addLast(): [Dog, Cow, Zebra] LinkedList after removeFirst(): [Cow, Zebra] LinkedList after removeLast(): [Cow]
Iterating Through a LinkedList
The enhanced for‑loop offers a concise way to traverse elements:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animals = new LinkedList<>();
animals.add("Cow");
animals.add("Cat");
animals.add("Dog");
System.out.println("LinkedList: " + animals);
System.out.println("Accessing linked list elements:");
for(String animal: animals){
System.out.print(animal + ", ");
}
}
}
Output
LinkedList: [Cow, Cat, Dog] Accessing linked list elements: Cow, Cat, Dog,
LinkedList vs. ArrayList
Both classes implement List, but differ in performance characteristics:
| LinkedList | ArrayList |
|---|---|
Implements List, Queue, Deque | Implements List |
| Node stores prev, data, next | Single element per array slot |
| Doubly‑linked structure | Resizable array |
| Insertions/ deletions are O(1) when position known | Insertions after an index require shifting O(n) |
| Random access requires traversal O(n) | Direct index access O(1) |
Note: You can instantiate a LinkedList via any of its interfaces:
// via List
List<String> animals1 = new LinkedList<>();
// via Queue
Queue<String> animals2 = new LinkedList<>();
// via Deque
Deque<String> animals3 = new LinkedList<>();
When using an interface reference, only the methods defined by that interface are available.
Java
- Master Java Operators: Types, Syntax, & Practical Examples
- Java Comments: Types, Usage, and Best Practices
- Mastering Java's super Keyword: Advanced Usage & Practical Examples
- Mastering Java Interfaces: Concepts, Implementation, and Best Practices
- Mastering Java Try‑with‑Resources: Automatic Resource Management Explained
- Java Annotations Explained: Types, Placement, and Practical Examples
- Mastering Java ArrayList: Operations, Methods, and Best Practices
- Understanding Java Vector: Usage, Features, and Comparison with ArrayList
- Java LinkedList: Comprehensive Guide with Examples
- Java 8: A Comprehensive Quick Reference Guide