A queue needs two access points: one end to add, another to remove. You back it with either a linked list holding head and tail pointers, or a ring buffer over a fixed array. With a linked list, you enqueue at the tail and dequeue at the head, both O(1). The tail pointer is what keeps enqueue cheap; without it you would walk the whole list.
Array-backed queues use two indices that chase each other and wrap around the buffer. That gives O(1) operations with far better cache behavior and no per-node allocation. The catch is fixed capacity, so you either grow the array or reject when full.
Pick the ring buffer when throughput and memory locality matter, like network packet handling. Reach for the linked list when the queue must grow without bound and allocation cost is acceptable.
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.