Close Menu
    Facebook X (Twitter) Instagram
    pyprogramming.org
    Facebook X (Twitter) Instagram
    pyprogramming.org
    Home»Data Structure»Linked List Data Structure
    Data Structure

    Linked List Data Structure

    Learn about linked lists in Python, a powerful data structure for dynamic data storage. Perfect for beginners with a foundational understanding of Python.
    Python ProgrammingBy Python ProgrammingMay 30, 2024No Comments8 Mins Read
    Facebook Twitter Pinterest LinkedIn Tumblr Email
    Share
    Facebook Twitter LinkedIn Pinterest Email

    What is a Linked List?

    A linked list is a fundamental data structure used in computer science to store a collection of elements. Unlike arrays, which store elements in contiguous memory locations, linked lists store elements in nodes that are linked together using pointers. This non-contiguous memory allocation makes linked lists highly flexible for dynamic data storage, allowing for efficient insertions and deletions.

    Key Characteristics

    1. Nodes: The building blocks of a linked list. Each node contains two parts:
      • Data: The value or information stored in the node.
      • Next Reference: A pointer or reference to the next node in the sequence. This creates a chain-like structure, connecting all the nodes.
    2. Head: The first node in a linked list. The head is crucial because it serves as the starting point for traversing the list.
    3. Tail: The last node in a linked list, which points to None, indicating the end of the list.

    Types of Linked Lists

    1. Singly Linked List: Each node contains a single reference to the next node. This is the simplest form of a linked list.
    2. Doubly Linked List: Each node contains two references: one to the next node and one to the previous node. This allows for traversal in both directions but requires more memory.
    3. Circular Linked List: The last node in the list points back to the head, forming a circular structure. This can be either singly or doubly linked.

    Linked List Fundamentals

    A linked list is a fundamental data structure in computer science. It consists of nodes where each node contains data and a reference (link) to the next node in the sequence. This allows for dynamic memory allocation and efficient insertion and deletion operations compared to arrays.

    Imagine you have a collection of items you want to store, but they don’t necessarily need to be next to each other in memory. That’s where linked lists come in. Unlike arrays that store elements in contiguous memory locations, linked lists consist of nodes that are scattered in memory but linked together by pointers. Each node contains two parts: the data and a reference (often called “next”) to the next node in the sequence.

    Node Structure

    At the heart of a linked list is the node. A node is a simple object with two attributes: the data it holds and the reference to the next node in the list. Think of it like a train where each car (node) is connected to the next one via a coupling (reference).

    Here’s a basic node structure in Python:

    class Node:
        def __init__(self, data):
            self.data = data
            self.next = None

    Illustrative Example

    To make things clearer, picture a train of connected cars. Each car holds some cargo (data) and has a coupler (next reference) that links it to the next car. This visualization helps you understand how linked lists function.

    Node1 (data: 1) -> Node2 (data: 2) -> Node3 (data: 3) -> None

    In the example above, Node1 is the head of the list, pointing to Node2, which in turn points to Node3. Node3 points to None, indicating the end of the list.

    Inserting a Node at the Beginning

    Code Explanation

    Inserting a node at the beginning of a linked list involves a few straightforward steps:

    1. Create a new node.
    2. Assign its data.
    3. Set its next reference to the current head of the list.
    4. Update the head of the list to this new node.

    Let’s break down the code:

    class LinkedList:
        def __init__(self):
            self.head = None
    
        def insert_at_beginning(self, data):
            new_node = Node(data)  # Step 1 and 2
            new_node.next = self.head  # Step 3
            self.head = new_node  # Step 4

    Example Implementation

    Here’s how you might use this method in practice:

    linked_list = LinkedList()
    linked_list.insert_at_beginning(3)
    linked_list.insert_at_beginning(2)
    linked_list.insert_at_beginning(1)

    After executing the above code, the linked list will look like this:

    Node1 (data: 1) -> Node2 (data: 2) -> Node3 (data: 3) -> None

    Inserting a Node at the End

    Code Explanation

    To insert a node at the end, you need to:

    1. Create a new node.
    2. Traverse the list to find the last node.
    3. Update the next reference of the last node to point to the new node.

    Here’s the breakdown:

    def insert_at_end(self, data):
        new_node = Node(data)  # Step 1
        if not self.head:  # If the list is empty
            self.head = new_node
            return
        last_node = self.head
        while last_node.next:  # Step 2
            last_node = last_node.next
        last_node.next = new_node  # Step 3

    Example Implementation

    Here’s how you can use this method:

    linked_list.insert_at_end(4)
    linked_list.insert_at_end(5)

    After executing the above code, the linked list will look like this:

    Node1 (data: 1) -> Node2 (data: 2) -> Node3 (data: 3) -> Node4 (data: 4) -> Node5 (data: 5) -> None

    Searching a Node in a Singly Linked List

    Algorithm Breakdown

    To search for a specific value, you need to iterate through the list and compare each node’s data with the target value. If you find a match, you return the node; otherwise, you continue until you reach the end of the list.

    Code Explanation

    Here’s the code to search for a value:

    def search(self, key):
        current = self.head
        while current:
            if current.data == key:
                return current
            current = current.next
        return None

    Example Implementation

    Let’s say you want to search for the value 3:

    found_node = linked_list.search(3)
    if found_node:
        print(f"Node with data {found_node.data} found!")
    else:
        print("Node not found.")

    This will output:

    Node with data 3 found!

    Deleting a Node in a Linked List

    Special Cases

    When deleting a node, you need to handle several cases:

    1. Deleting the head node.
    2. Deleting a node in the middle.
    3. Deleting the last node.
    4. Attempting to delete a non-existent node.

    Code Explanation

    Here’s the code for deleting a node, considering different scenarios:

    def delete_node(self, key):
        current = self.head
    
        # Case 1: Deleting the head node
        if current and current.data == key:
            self.head = current.next
            current = None
            return
    
        prev = None
        # Case 2 and 3: Deleting middle or last node
        while current and current.data != key:
            prev = current
            current = current.next
    
        # Case 4: Node not found
        if current is None:
            return
    
        prev.next = current.next
        current = None

    Example Implementation

    Here’s how you might use the delete method:

    linked_list.delete_node(3)

    After executing the above code, if the linked list was:

    Node1 (data: 1) -> Node2 (data: 2) -> Node3 (data: 3) -> Node4 (data: 4) -> None

    It will now be:

    Node1 (data: 1) -> Node2 (data: 2) -> Node4 (data: 4) -> None

    Traversing a Linked List

    Code Explanation

    Traversing a linked list involves visiting each node from the head to the last node. You can perform various operations during traversal, such as printing the data or summing the values.

    Here’s a simple traversal method:

    def traverse(self):
        current = self.head
        while current:
            print(current.data)
            current = current.next

    Example Implementation

    To traverse and print the linked list:

    linked_list.traverse()

    This will print:

    1
    2
    4

    Reversing a Linked List

    Code Explanation

    Reversing a linked list means changing the direction of the next references. This involves iterating through the list and reversing the pointers one by one.

    Here’s how you can do it:

    def reverse(self):
        prev = None
        current = self.head
        while current:
            next_node = current.next
            current.next = prev
            prev = current
            current = next_node
        self.head = prev

    Example Implementation

    Reversing the list:

    linked_list.reverse()

    If the list was:

    Node1 (data: 1) -> Node2 (data: 2) -> Node4 (data: 4) -> None

    After reversing, it will be:

    Node4 (data: 4) -> Node2 (data: 2) -> Node1 (data: 1) -> None

    Detecting a Cycle in a Linked List

    Code Explanation

    A cycle in a linked list occurs when a node’s next reference points back to a previous node, creating a loop. The Floyd’s Cycle-Finding Algorithm, also known as the tortoise and hare algorithm, is an efficient way to detect cycles.

    Here’s the code:

    def has_cycle(self):
        slow = self.head
        fast = self.head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                return True
        return False

    Example Implementation

    To check for a cycle:

    if linked_list.has_cycle():
        print("Cycle detected!")
    else:
        print("No cycle detected.")

    Conclusion

    Linked lists are fundamental data structures that provide dynamic memory allocation, making them more flexible than arrays for certain tasks. We’ve explored the basics of linked lists, including node structure, insertion, deletion, searching, traversal, reversing, and cycle detection. Each operation was explained with clear code examples to help you understand and implement these concepts in Python.

    By mastering linked lists, you’re laying a strong

    foundation for more advanced data structures and algorithms. Keep practicing with the provided examples, experiment with different data types, and explore further into variations like doubly linked lists and circular linked lists. Happy coding!

    Data structures Deletion Dynamic Data Storage Insertion Linked List Node programming python Traversal
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Python Programming
    • Website

    Related Posts

    How to Plot Line of Best Fit in Python (With Examples)

    June 10, 2025

    Python Sets Are OP!!

    August 19, 2024

    Understanding if __name__ == ‘__main__’ in Python

    June 1, 2024
    Leave A Reply Cancel Reply

    Facebook X (Twitter) Instagram Pinterest
    © 2026 ThemeSphere. Designed by ThemeSphere.

    Type above and press Enter to search. Press Esc to cancel.