A Crowded Cinema Explains Linked Lists Better Than Your Textbook
A casual cinema story that uses scattered seats and friends to explain how linked lists work, including circular and doubly circular variations.

Think of a crowded cinema hall as your computer’s memory. The hall has a fixed size and is filled with seats, just like memory has a fixed size and is filled with individual memory addresses. Each memory address (seat) is a small location where you can store pieces of your data.
Now imagine you and your friends want to watch Project Hail Mary, and you walk into this cinema hall. You and your friends represent the data your program wants to store in memory. Programs do not store data randomly; otherwise, they would not be able to use it efficiently. Instead, programs follow standard methods to store and manage data called data structures. The most basic data structure is the array, and another important one is the linked list.
In this analogy:
An array is like reserving a contiguous block of seats for you and your friends, seats 101, 102, 103, and 104, all next to each other. If you know the first seat (the base address) and how many people you have, you can instantly find any friend’s seat by counting. This matches how arrays store elements in consecutive memory addresses, allowing fast access by index.
A linked list is like you and your friends sitting in different parts of the hall, not necessarily together. Each person holds a small slip of paper that says, “My data is here, and the next person in the list is sitting at seat X.” To find the fifth friend, you must start at the first person, follow their slip to the next seat, and continue step by step. This matches how linked list nodes are stored at noncontiguous addresses, with each node containing data and a pointer to the next node.
Arrays - Wanting One Clean Row
If you choose "array mode", you want all your fiends to sit in one clean row side by side, which means you asking cinema hall manager for five adjacent seats in a single blog with no gaps. Sometimes the hall manager simply cannot give you that, even if there are five empty seats in the hall. The empty seats may be in different rows and columns, not together.
This is what exactly happing with array. The array need one continuous block of memory addresses to hold all its elements. Even if the array is empty, it requires the defined area by the program. If the required block in not available, the array cannot be placed and therefor the program cannot execute, event though there are free memory address across the memory.
The benefit is, once the array is placed in the memory, you can jump straight to friend-3 with an index, because all elements are in a predictable order in memory.
Linked List - Scattered Seat & Smart Connections
In "Linked List mode", still the cinema hall is crowded and you do not worry about sitting side by side. Each friend takes any empty seat they can find. Friend-01 might sit in Row A, friend-02 in Row F, another friend in Row K, and so on. But here you follow one rule which is, each friend should remember "who I am" and where the next friend is sitting,
-"I am Friend-01 and next friend is in Row K seat 7".
-"I am Friend-03 and next friend is in Row C seat 4".
and so on.
When it comes to memory, each friend is a node, each seat is a memory address. "Who I am" is the value, the node holds and "I remember the next friend's seat" is the pointer or the reference to the next node. Together is chain is a singly linked list, a sequence of nodes where each node stores some data and a link to the next node, and none of them need to live in one continuous address range.
This method makes some operations easier. Think about your "OMW warrior", the latecomer. you don't have to worry about them either, because they just have to take any free seat in the hall and current last friend update their "next friend" from NULL to new friend's seat. Other friends do not have to move in a linked list, it just allocates a new node at any free address and change the pointer of the current last node, and make the new node as the last node.
Imagine a friend in the middle suddenly gets a call from their partner, they now have a last minute date and have to leave immediately to avoid World War III. In this scenario, the previous friend just change their pointer to skip the leaving friend and point to the next one. No one else move. If this happens in an array, inserting or deleting in the middle usually moves many elements, which makes the operations more expensive.
Arrays and Linked List in the Same Cinema
The cinema hall helps us to compare the two data structures. You and your friends are in adjacent seats in a single row (an array). Finding the third friend is extremely easy, you just count from the first seat, and your friend is right there. This practice has constant-time random access (accessing an element by index takes the same time regardless of array size - O(1)) because the time it takes to find any friend by their seat number does not depend on how many people are in the row.
With the scattered seating (Linked List), finding third friend is not simple as in an array. You start at the first friend and following "next friend" pointers until you count three people. As the number of friend shows, the walk gets longer, therefor access by position takes more time (grows linearly - O(n)) than in an array.
Array gives faster index access but need a clean block of seats but need need a clean block of seats. Linked List, on the other hand, allows you to survive in the messy, fragmented hall by linking scattered seats with pointers, but you have to pay with a slower position based access.
Core Linked List Types
The above story describes a Singly Linked List, but there are other types of Linked Lists also. They are categorised based on how nodes behave.
Singly Linked List: each friend knows only where the next friend is sitting and the last friend does not point to anyone since there is no "next friend", so the last fiend's "next friend" is empty, or NULL. This practice creates a one way chain from the first friend to the last.
Double Linked List: each friend points to both "next friend" and "previous friend". you can walk forward from first friend to last or backward from last friend to first friend, because each node knows who is in front and who is behind. This makes it easier to move both ways through the nodes, at the cost of storing an extra pointer in every node.
Singly Circular Linked List: the chain gets a loop, the friends are still scattered, and each one knows only where the "next friend" is, but now the last friend does not say "no one after me!". Instead the last friend points back to the first friend's seat. If you keep following "next friend" links, you go around the group again and again, without hitting an end. This is super useful when you want to cycle through items repeatedly. Because of this behaviour, a singly circular linked list can be used to implement a circular queue, and with that, it can be used for round-robin operations.
Double Circular Linked List: here is where you combine both ideas. Each node remembers the both "next friend" and "previous friend", and the first and last friend also maintain a bidirectional link to form a full loop. You can travers forward or backward around the group forever. This practice allows very flexible navigation and efficient insertion or deletion at both ends, at the cost f more pointer management and memory per node. Double Circular linked lists are extremely helpful for building circular queues and circular buffers.
Understanding Memory with Cinema Hall
The cinema hall analogy can be used to understand the memory concept in you computer further more. The cinema hall is your computer memory (primary memory / main memory), seats are the memory addresses in your memory, people are the data. Arrays are the groups that demands a clean row of seats, with fast index based access. Linked lists are groups that spread out over available seats, using pointers called "next friend" and sometimes "previous friend" to stay connected, making dynamic insertion and deletion easier, specially in a crowded and fragmented memory space.