Introducing Linked Lists — An Essential Data Structure

Wilson Chu
8 min readNov 18, 2023

--

Photo by Max Vertsanov on Unsplash

Today, let’s get to the bottom of an important foundational concept of computer science: Linked Lists. Don’t worry if you have no clue what I’m talking about — we’re going to break it down step by step, using JavaScript to write sample code along the way.

What’s the Buzz About Linked Lists?

Picture a Linked List as a way to organize data sequentially. It’s like a chain of connected elements, where each element carries information and points to the next one. Unlike arrays, Linked Lists don’t need a continuous block of memory, so individual chunks of data can be stored anywhere in memory, offering flexibility and efficiency.

We can visualize it as a train with carriages (nodes), each carrying cargo (data) and hitched to the next one in line (pointers). That’s the magic of a Linked List!

Nodes and Pointers

Nodes — The Building Blocks

Nodes are the fundamental building blocks of Linked Lists. Each node has two parts: data, holding any piece of information, and a pointer that indicates the direction to the next node. Let’s create a simple node in JavaScript:

class Node {
constructor(data, next = null) {
this.data = data;
this.next = next;
}
}

In the JavaScript Node class, this.data represents the information stored in the node, and this.next is the pointer that points to the next node in the sequence. next = null is used to declare the most recently created Node as the tail of the Linked List by default – more on this later!

Pointers — Connecting the Dots

Pointers play a vital role. The next property in each node points to the subsequent node, creating the chain that lets us traverse the Linked List.

In the context of a Linked List, a pointer is like an arrow that tells us where to find the next piece of information. It’s the connection between nodes (e.g. the hitch between train carriages). More specifically, a pointer is a variable that stores the memory address of another variable inside your machine. It’s like having a sticky note that tells you where to find something.

Another way to think about this is like following a trail of breadcrumbs. Each breadcrumb (node) not only contains something valuable (data) but also points you to the next one in the sequence. The pointer is what allows us to navigate through the Linked List from one node to the next.

Here’s a visual representation:

+---------+         +---------+         +---------+
| Data | ---> | Data | ---> | Data |
+---------+ +---------+ +---------+
| Pointer | | Pointer | | Pointer |
+---------+ +---------+ +---------+

In the Node class, this.next serves as the pointer, and it's this component that makes Linked Lists powerful. It allows dynamic organization of data, where each node can point to another, forming a chain of information connecting one piece to another.

Understanding nodes and pointers is fundamental to grasping the essence of Linked Lists. Nodes store data, and pointers guide the flow of information from one node to the next, creating a structured and efficient way to organize data.

Heads or Tails?

You may have heard people talk about heads or tails when they’re talking about Linked Lists. Are they flipping coins, leaving they’re code to chance? Hopefully not. Simply put, the first node of any Linked List is always called the head. Subsequently, the last node of any Linked List is always called the tail. Yes, that’s it. Really.

Photo by Nick Fewings on Unsplash

Let’s imagine we have a bookshelf, filled with a collection of books. Each book (node) on the shelf contains information (data). The organization begins with the first book and ends with the last one. The “head” of the Linked List is like the first book on the shelf. It marks the starting point of your collection. When you want to first access the information in the Linked List, you start from the head. The “tail” of the Linked List is like the last book on the shelf. It marks the end of your collection.

When you’re adding a new book (node) to the collection, you often add it after the last book in line (the tail), extending the sequence. This newly added book then becomes the tail. Now, imagine that each book has pointers. The last page of each book tells you where to find the next one. This is akin to the “next” pointers in a Linked List, guiding you from one node to the next.

Types of Linked Lists

1. Singly Linked List

Singly Linked List

In a Singly Linked List, nodes point to the next one in a single direction. It’s like a line of people, and you can only see the person in front of you. Traversal happens from the first person (head) to the last (tail). We can use our simple train carriage or bookshelf analogy here.

2. Doubly Linked List

Doubly Linked List

A Doubly Linked List steps it up. Nodes have pointers to both the next and previous nodes. It’s like having eyes in the back of your head — you can see and move both forward and backward.

3. Circular Linked List

Circular Linked List

A Circular Linked List forms a closed loop, with the last node pointing back to the first. The tail here doesn’t ever point to null, but back to the head. It’s like a perpetual chain, useful when you want to keep going in a loop over and over again, cycling indefinitely through an entire list. 24-hour music loops, anyone?

Perks of Linked Lists

Understanding why Linked Lists actually matter is crucial. Here are some common advantages:

1. Dynamic Size

Linked Lists can grow or shrink dynamically, handling data of various sizes without needing a massive chunk of memory. Perfect for unpredictable data!

2. Seamless Insertion and Deletion

Adding or removing elements in a Linked List is like adjusting links. It’s simpler than arrays, where you might need to shift things around.

3. No Need to Reserve Memory

Unlike arrays, Linked Lists don’t require a fixed amount of memory upfront. They use memory as needed, making them more flexible.

Challenges and Considerations

But hey, it’s not all rainbows. Keep these things in mind:

1. Sequential Access

In a Linked List, you have to go through each node in order. No jumping ahead like in arrays. It’s like reading a book from the first page to the last. No spoilers!

2. Extra Memory Usage

Each node needs some extra memory for the pointers. If memory efficiency is crucial, that’s something to consider.

Arrays vs. Linked Lists: A Quick Comparison

Before we dive into coding, let’s compare Linked Lists to another popular data structure: Arrays.

Arrays

  • Memory Allocation: Arrays require contiguous memory allocation.
  • Size: Fixed size or needs resizing operations.
  • Insertion/Deletion: Costly if elements are inserted or deleted frequently.

Linked Lists

  • Memory Allocation: Nodes can be scattered in memory.
  • Size: Dynamic size, easily accommodates varying amounts of data.
  • Insertion/Deletion: Efficient due to straightforward link adjustments.
Arrays vs. Linked Lists

Understanding these differences helps you choose the right data structure for your specific needs.

Let’s Code: Crafting a Simple Linked List in JavaScript

Time to put our new knowledge into action! Let’s create a basic Singly Linked List in JavaScript:

class LinkedList {
constructor() {
this.head = null;
}

insertFirst(data) {
this.head = new Node(data, this.head);
}

size() {
let count = 0;
let current = this.head;

while (current) {
count++;
current = current.next;
}

return count;
}
}

Here, we’ve defined a LinkedList class with a head property as the starting point. The insertFirst method adds a new node to the beginning, and size tells us how many nodes are in the list.

Real-world Applications of Linked Lists

So, why should you care about Linked Lists? Because they’re everywhere! Here are some practical uses:

1. Memory Management

Operating systems use Linked Lists to efficiently manage memory. It’s like having a list of available memory blocks, and when a program needs space, the system finds a suitable block.

2. Undo Feature

Ever wondered how the “undo” button works on your favourite website or app? Linked Lists can store different states of a document, and traversing through them allows you to undo actions.

3. Music Playlists

Imagine each song in a playlist as a node. The next pointer determines the order. Linked Lists provide a natural way to organize and navigate through your favorite tunes.

Next Steps for Learning Linked Lists in JavaScript

Feeling curious? Here are some steps to dive deeper into Linked Lists:

1. Try Coding Challenges

Platforms like LeetCode and HackerRank offer coding challenges involving Linked Lists. It’s a fantastic way to practice what you’ve learned, and to get familiar with what technical interviews may look like at some of the world’s top companies!

2. Visualize with Simulations

Explore visualizations and simulations of Linked Lists. Websites like VisuAlgo provide interactive animations, making complex concepts easier to understand.

3. Code in Different Languages

Implement Linked Lists in various programming languages like Java, Ruby, or Python. This helps solidify your understanding and makes you a more versatile developer for any project!

Wrapping Up: Embracing the Magic of Linked Lists in JavaScript

Whether you’re just starting your coding adventure or you’ve been at it for a bit, embracing Linked Lists opens the door to a deeper understanding of the fascinating world of data structures. Understanding Linked Lists will enable you to create amazing programs — think of your favourite music or video streaming app, or something like Figma and Photoshop. Dive in, experiment with your own code, and enjoy the magic of Linked Lists in your JavaScript journey. Happy coding!

Here are the main references used in crafting the article:

  1. Introduction to Linked Lists, GeeksforGeeks
  2. Linked List in A Data Structure: All You Need to Know, SimpliLearn
  3. Visualizing Algorithms — Linked List, VisuAlgo

These resources provide a combination of documentation, tutorials, and visualizations to cover both the conceptual and practical aspects of Linked Lists in JavaScript. I encourage you to explore them further for more in-depth learning!

--

--