A linked list is a linear data structure that stores a collection of data elements dynamically. It consists of a series of connected nodes, where each node stores the data and the address of the next node. Unlike arrays, elements in a linked list are not stored at contiguous locations in memory. Instead, each element points to the next element in the list.
Each node in a linked list typically consists of two components: data and a pointer to the next node in the sequence. Linked lists can be used to implement several other common abstract data types, including lists, stacks, queues, associative arrays, and S-expressions. Linked lists allow insertion and removal of nodes at any point in the list, and allow doing so with a constant number of operations by keeping the link previous to the link being added or removed in memory during list traversal.
There are three types of linked lists: singly linked list, doubly linked list, and circular linked list. In a singly linked list, each node points to the address of the next node in the list. In a doubly linked list, each node has two pointers, one pointing to the previous node and the other pointing to the next node. In a circular linked list, the last node points to the first node.
Linked lists are versatile data structures that provide dynamic memory allocation, which means that the size of the list can be changed during runtime. However, linked lists require additional memory for storing the pointers, compared to arrays.