Seth Barrett

Daily Blog Post: January 17th, 2023

Jan 17th, 2023

Implementing Linked Lists in Python
Python11

Hello fellow Python enthusiasts!

In this post, we will be covering some more advanced topics in Python and diving into the world of linked lists.

But first, let's start with a quick refresher on what a linked list is. A linked list is a linear data structure where each element is a separate object, linked together using pointers. Each element, or node, in a linked list consists of two fields: a data field to store the element, and a next field to store the reference to the next node in the list.

There are two types of linked lists: singly linked lists and doubly linked lists. In a singly linked list, each node has a reference to the next node in the list, but not the previous one. In a doubly linked list, each node has a reference to both the next and previous nodes.

A singly linked list is a linear data structure where each element is a separate object, linked together using pointers. Each element, or node, in a singly linked list consists of two fields: a data field to store the element, and a next field to store the reference to the next node in the list. The nodes are linked in a sequential manner, such that the next field of each node points to the next node in the list.

Singly linked lists are useful for a variety of applications, such as:

  • Implementing stacks, which are data structures that support last-in, first-out (LIFO) semantics.
  • Implementing queues, which are data structures that support first-in, first-out (FIFO) semantics.
  • Storing and manipulating data in a linear fashion, such as a list of items.
  • Performing searches and insertions/deletions on a list of items, as these operations can be performed in O(n) time on a singly linked list.

Singly linked lists have some advantages over other data structures, such as arrays. For example, they do not require contiguous blocks of memory, so they can be more flexible in terms of memory usage. They also allow for efficient insertions and deletions at the head of the list, as no elements need to be shifted around in memory.

However, singly linked lists have some disadvantages as well. They do not allow for efficient insertions and deletions at the tail of the list, as the last element does not have a reference to the element preceding it. They also do not allow for efficient access to the elements in the middle of the list, as the list must be traversed sequentially from the head to find a specific element.

Now that we have a basic understanding of linked lists, let's see how we can implement them in Python.

We can start by creating a Node class to represent each node in the linked list. The Node class will have two instance variables: data to store the element, and next to store the reference to the next node.

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

Next, we can create a LinkedList class to represent the linked list itself. This class will have a head instance variable to keep track of the first node in the list.

class LinkedList:
    def __init__(self):
        self.head = None

We can then add various methods to the LinkedList class to manipulate the list. For example, we can add a method to add a new node to the list, a method to remove a node from the list, and a method to find a specific node in the list.

class LinkedList:
    def __init__(self):
        self.head = None
    
    def add_node(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node
    
    def remove_node(self, data):
        current_node = self.head
        previous_node = None
        while current_node:
            if current_node.data == data:
                if previous_node:
                    previous_node.next = current_node.next
                else:
                    self.head = current_node.next
                return
            previous_node = current_node
            current_node = current_node.next
    
    def find_node(self, data):
        current_node = self.head
        while current_node:
            if current_node.data == data:
                return current_node
            current_node = current_node.next
        return None

That's it! We now have a basic implementation of a singly linked list in Python.

I hope this has been a helpful introduction to linked lists in Python. As always, feel free to leave any comments or questions below.

Happy coding!