A sequence of separately allocated nodes, each holding a value and a pointer to the next one (a doubly linked list also has a pointer to the previous one). Inserting or removing next to a node you already hold is O(1), but reaching the i-th element means walking i pointers. Compare a dynamic array.