A linked List is a linear data structure where each element is a separate object that stores data and a
reference to the next node. The LinkedList class in Java, present in the java.util package, implements
this data structure. Although it is not commonly used in production, it has certain advantages. It can be
used as an ArrayList for list type operations such as insertion, deletion, removal, etc., and it can also be
used as an ArrayDeque for queue or dequeue type operations, implementing the Deque interface.
One of the advantages of using LinkedList is dynamic memory allocation, where memory allocation
is done at runtime, unlike arrays where the size is needed to be fixed beforehand. LinkedList elements
do not need contiguous memory locations. Additionally, insert and delete operations in LinkedList are
less expensive even in the worst-case scenario compared to ArrayList and ArrayDeque, which use a
resizable array internally.
However, there are certain disadvantages of using LinkedList. The nodes cannot be accessed directly;
instead, we need to start from the head and follow the links to reach the node we wish to access.
ArrayList will have fewer cache misses while traversing than LinkedList, making it more cache-friendly.
Internally, LinkedList is implemented using the doubly linked list data structure. The main difference
between a normal linked list and a doubly LinkedList is that a doubly linked list contains an extra
pointer, typically called the previous pointer, together with the next pointer and data that are there in a
singly linked list.
LinkedList class implements all the functions of the List interface, just like an ArrayList, and the
common methods between LinkedList and ArrayList include add(), add(int index, E element),
contains(Object o), remove(int index), remove(Object o), get(int index), set(int index, E element),
indexOf(Object o), lastIndexOf(Object o), and isEmpty(). All these methods have different time
complexities.
LinkedList class also implements the Queue and Deque interfaces, providing additional methods like
add(E e), remove(), element(), offer(E e), poll(), peek(), addFirst(E e), addLast(E e), removeFirst(),
removeLast(), getFirst(), getLast(), offerFirst(E e), offerLast(E e), and pollFirst(). These methods have
different functionalities and their time complexities also differ.
Here's an example code that demonstrates how to use the LinkedList class in Java:
The output of the above code would be: [A, B, C].