Python - Data Structures - Linked Lists

Linked Lists Data Structures in Python 

In Python, a linked list is a linear data structure that stores elements in a sequence, where each element is called a node and each node contains a link to the next node. While linked lists aren't supported natively by Python, they can be easily implemented.

A node contains two parts; A "data" and another "next", where data stores the actual value of the element. next stores the reference to the next node in sequence.

Types of Linked Lists

There are three types of linked lists:

  1. Singly Linked List: In a singly linked list each node points to the next node, and the last node points to None.
  2. Doubly Linked List: In a doubly linked list each node has two references, one to the next node and another to the previous node.
  3. Circular Linked List: In a circular linked list the last node points back to the head node, forming a circle.

Advantages of Using Linked List

There are the following advantages of using a linked list:

  • Dynamic Size
  • Efficient Insertions & Deletion
  • Better Memory Utilizations
  • No Contiguous Memory Requirement
  • Easy Implementations of Data Structure
  • Infinite Expansion
  • Efficient Handling of Frequent Changes
  • Improved Performance for Sparse Data

Create a Singly Linked List

Below is an example of how to create and use a singly linked list:

class Node:
    def __init__(self, data):
        self.data = data  # The data part
        self.next = None  # The reference to the next node


class LinkedList:
    def __init__(self):
        # Initialize the linked list with an empty head
        self.head = None

    # Method to add a node at the end
    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            return
        current = self.head
         # Traverse to the last node
        while current.next:
            current = current.next
        current.next = new_node

    # Method to display the linked list
    def display(self):
        current = self.head
        # Traverse through the list
        while current:
            print(current.data, end=" -> ")
            current = current.next
        print("None")

    # Method to delete a node by value
    def delete(self, key):
        current = self.head

        # If the head node itself holds the key to be deleted
        if current and current.data == key:
            self.head = current.next  # Change head
            current = None
            return

        # Search for the key to be deleted, keep track of the previous node
        prev = None
        while current and current.data != key:
            prev = current
            current = current.next

        # If the key was not present in the linked list
        if current is None:
            return

        # Unlink the node from the linked list
        prev.next = current.next
        current = None

ll = LinkedList()
ll.append(10)
ll.append(20)
ll.append(30)
ll.display()
ll.delete(20)
ll.display() 

Create a Doubly Linked List

Here is an implementation of a Doubly Linked List (DLL) in Python. In a DLL, each node has three parts: the data, a pointer to the previous node, and a pointer to the next node:

class Node:
    def __init__(self, data):
        # The data part
        self.data = data
        # Reference to the previous node
        self.prev = None
        # Reference to the next node
        self.next = None

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

    # Method to add a node at the end
    def append(self, data):
        new_node = Node(data)
        if not self.head:
            # If the list is empty, make the new node the head
            self.head = new_node
            return
        current = self.head
        while current.next:  # Traverse to the last node
            current = current.next
        current.next = new_node
        new_node.prev = current 

    # Method to add a node at the beginning
    def prepend(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            return
        self.head.prev = new_node
        new_node.next = self.head
        self.head = new_node 

    # Method to delete a node by value
    def delete(self, key):
        current = self.head
        while current:
            if current.data == key:  # Node to delete found
                if current.prev:  # If it's not the head node
                    current.prev.next = current.next
                else:  # If it's the head node
                    self.head = current.next
                if current.next:  # If it's not the last node
                    current.next.prev = current.prev
                current = None
                return
            current = current.next

    # Method to display the linked list from the beginning
    def display(self):
        current = self.head
        while current:
            print(current.data, end=" <-> ")
            current = current.next
        print("None")

    # Method to display the linked list in reverse order
    def display_reverse(self):
        current = self.head
        if not current:
            print("None")
            return
        # Go to the last node
        while current.next:
            current = current.next
        # Traverse backward
        while current:
            print(current.data, end=" <-> ")
            current = current.prev
        print("None")

dll = DoublyLinkedList()
dll.append(10)
dll.append(20)
dll.append(30)
dll.display()
dll.display_reverse()
dll.prepend(5)
dll.display()
dll.delete(20)
dll.display()
dll.display_reverse() 

Create a Circular Linked List

A circular linked list (CLL) is a linked list in which the last node points back to the head node, forming a circle. Circular linked lists can be either singly or doubly linked:

class Node:
    def __init__(self, data):
        self.data = data  # The data part
        self.next = None  # The reference to the next node


class CircularLinkedList:
    def __init__(self):
        self.head = None  # Initialize the list with an empty head

    # Method to append a node to the list
    def append(self, data):
        new_node = Node(data)
        if not self.head:  # If the list is empty
            self.head = new_node
            new_node.next = self.head  # Point the new node to itself
        else:
            current = self.head
            while current.next != self.head:  # Traverse to the last node
                current = current.next
            current.next = new_node  # Set the last node's next to the new node
            new_node.next = self.head  # Point the new node's next to the head

    # Method to display the circular linked list
    def display(self):
        if not self.head:
            print("List is empty")
            return
        current = self.head
        while True:
            print(current.data, end=" -> ")
            current = current.next
            if current == self.head:  # Stop when we come back to the head
                break
        print("(back to head)")

    # Method to delete a node by value
    def delete(self, key):
        if not self.head:
            print("List is empty")
            return

        current = self.head
        prev = None

        # Check if the head node is to be deleted
        if current.data == key:
            if current.next == self.head:  # If there's only one node
                self.head = None
                return
            # Otherwise, find the last node to update its next pointer
            while current.next != self.head:
                current = current.next
            current.next = self.head.next
            self.head = self.head.next
            return

        # Search for the node to delete
        prev = self.head
        current = self.head.next
        while current != self.head:
            if current.data == key:
                prev.next = current.next
                return
            prev = current
            current = current.next
        print(f"Node with value {key} not found")

    # Method to insert a node after a specific value
    def insert_after(self, target, data):
        if not self.head:
            print("List is empty")
            return
        current = self.head
        while True:
            if current.data == target:
                new_node = Node(data)
                new_node.next = current.next
                current.next = new_node
                return
            current = current.next
            if current == self.head:  # Stop if we've traversed the whole list
                break
        print(f"Node with value {target} not found")

cll = CircularLinkedList()
cll.append(10)
cll.append(20)
cll.append(30)
cll.display() 
cll.insert_after(20, 25)
cll.display()
cll.delete(10)
cll.display()
cll.delete(40)

Use Cases of Linked-List

There are the following use cases of the linked list:

  • Dynamic Memory Allocation: Linked lists work well in situations where the amount of memory is changing or is unknown in advance because they can expand and contract at runtime.
  • Use of Other Data Structures: Graphs, stacks, queues, and other more intricate data structures are all implemented using linked lists as their foundation.
  • Executing Repeated Insertions and Deletions: These are the recommended options for applications that need regular insertions and deletions since they can be achieved more effectively than with array-based structures.

logo

Python

Beginner 5 Hours

Linked Lists Data Structures in Python 

In Python, a linked list is a linear data structure that stores elements in a sequence, where each element is called a node and each node contains a link to the next node. While linked lists aren't supported natively by Python, they can be easily implemented.

A node contains two parts; A "data" and another "next", where data stores the actual value of the element. next stores the reference to the next node in sequence.

Types of Linked Lists

There are three types of linked lists:

  1. Singly Linked List: In a singly linked list each node points to the next node, and the last node points to None.
  2. Doubly Linked List: In a doubly linked list each node has two references, one to the next node and another to the previous node.
  3. Circular Linked List: In a circular linked list the last node points back to the head node, forming a circle.

Advantages of Using Linked List

There are the following advantages of using a linked list:

  • Dynamic Size
  • Efficient Insertions & Deletion
  • Better Memory Utilizations
  • No Contiguous Memory Requirement
  • Easy Implementations of Data Structure
  • Infinite Expansion
  • Efficient Handling of Frequent Changes
  • Improved Performance for Sparse Data

Create a Singly Linked List

Below is an example of how to create and use a singly linked list:

python
class Node: def __init__(self, data): self.data = data # The data part self.next = None # The reference to the next node class LinkedList: def __init__(self): # Initialize the linked list with an empty head self.head = None # Method to add a node at the end def append(self, data): new_node = Node(data) if not self.head: self.head = new_node return current = self.head # Traverse to the last node while current.next: current = current.next current.next = new_node # Method to display the linked list def display(self): current = self.head # Traverse through the list while current: print(current.data, end=" -> ") current = current.next print("None") # Method to delete a node by value def delete(self, key): current = self.head # If the head node itself holds the key to be deleted if current and current.data == key: self.head = current.next # Change head current = None return # Search for the key to be deleted, keep track of the previous node prev = None while current and current.data != key: prev = current current = current.next # If the key was not present in the linked list if current is None: return # Unlink the node from the linked list prev.next = current.next current = None ll = LinkedList() ll.append(10) ll.append(20) ll.append(30) ll.display() ll.delete(20) ll.display()

Create a Doubly Linked List

Here is an implementation of a Doubly Linked List (DLL) in Python. In a DLL, each node has three parts: the data, a pointer to the previous node, and a pointer to the next node:

python
class Node: def __init__(self, data): # The data part self.data = data # Reference to the previous node self.prev = None # Reference to the next node self.next = None class DoublyLinkedList: def __init__(self): self.head = None # Method to add a node at the end def append(self, data): new_node = Node(data) if not self.head: # If the list is empty, make the new node the head self.head = new_node return current = self.head while current.next: # Traverse to the last node current = current.next current.next = new_node new_node.prev = current # Method to add a node at the beginning def prepend(self, data): new_node = Node(data) if not self.head: self.head = new_node return self.head.prev = new_node new_node.next = self.head self.head = new_node # Method to delete a node by value def delete(self, key): current = self.head while current: if current.data == key: # Node to delete found if current.prev: # If it's not the head node current.prev.next = current.next else: # If it's the head node self.head = current.next if current.next: # If it's not the last node current.next.prev = current.prev current = None return current = current.next # Method to display the linked list from the beginning def display(self): current = self.head while current: print(current.data, end=" <-> ") current = current.next print("None") # Method to display the linked list in reverse order def display_reverse(self): current = self.head if not current: print("None") return # Go to the last node while current.next: current = current.next # Traverse backward while current: print(current.data, end=" <-> ") current = current.prev print("None") dll = DoublyLinkedList() dll.append(10) dll.append(20) dll.append(30) dll.display() dll.display_reverse() dll.prepend(5) dll.display() dll.delete(20) dll.display() dll.display_reverse()

Create a Circular Linked List

A circular linked list (CLL) is a linked list in which the last node points back to the head node, forming a circle. Circular linked lists can be either singly or doubly linked:

python
class Node: def __init__(self, data): self.data = data # The data part self.next = None # The reference to the next node class CircularLinkedList: def __init__(self): self.head = None # Initialize the list with an empty head # Method to append a node to the list def append(self, data): new_node = Node(data) if not self.head: # If the list is empty self.head = new_node new_node.next = self.head # Point the new node to itself else: current = self.head while current.next != self.head: # Traverse to the last node current = current.next current.next = new_node # Set the last node's next to the new node new_node.next = self.head # Point the new node's next to the head # Method to display the circular linked list def display(self): if not self.head: print("List is empty") return current = self.head while True: print(current.data, end=" -> ") current = current.next if current == self.head: # Stop when we come back to the head break print("(back to head)") # Method to delete a node by value def delete(self, key): if not self.head: print("List is empty") return current = self.head prev = None # Check if the head node is to be deleted if current.data == key: if current.next == self.head: # If there's only one node self.head = None return # Otherwise, find the last node to update its next pointer while current.next != self.head: current = current.next current.next = self.head.next self.head = self.head.next return # Search for the node to delete prev = self.head current = self.head.next while current != self.head: if current.data == key: prev.next = current.next return prev = current current = current.next print(f"Node with value {key} not found") # Method to insert a node after a specific value def insert_after(self, target, data): if not self.head: print("List is empty") return current = self.head while True: if current.data == target: new_node = Node(data) new_node.next = current.next current.next = new_node return current = current.next if current == self.head: # Stop if we've traversed the whole list break print(f"Node with value {target} not found") cll = CircularLinkedList() cll.append(10) cll.append(20) cll.append(30) cll.display() cll.insert_after(20, 25) cll.display() cll.delete(10) cll.display() cll.delete(40)

Use Cases of Linked-List

There are the following use cases of the linked list:

  • Dynamic Memory Allocation: Linked lists work well in situations where the amount of memory is changing or is unknown in advance because they can expand and contract at runtime.
  • Use of Other Data Structures: Graphs, stacks, queues, and other more intricate data structures are all implemented using linked lists as their foundation.
  • Executing Repeated Insertions and Deletions: These are the recommended options for applications that need regular insertions and deletions since they can be achieved more effectively than with array-based structures.

Frequently Asked Questions for Python

Python is commonly used for developing websites and software, task automation, data analysis, and data visualisation. Since it's relatively easy to learn, Python has been adopted by many non-programmers, such as accountants and scientists, for a variety of everyday tasks, like organising finances.


Python's syntax is a lot closer to English and so it is easier to read and write, making it the simplest type of code to learn how to write and develop with. The readability of C++ code is weak in comparison and it is known as being a language that is a lot harder to get to grips with.

Learning Curve: Python is generally considered easier to learn for beginners due to its simplicity, while Java is more complex but provides a deeper understanding of how programming works. Performance: Java has a higher performance than Python due to its static typing and optimization by the Java Virtual Machine (JVM).

Python can be considered beginner-friendly, as it is a programming language that prioritizes readability, making it easier to understand and use. Its syntax has similarities with the English language, making it easy for novice programmers to leap into the world of development.

To start coding in Python, you need to install Python and set up your development environment. You can download Python from the official website, use Anaconda Python, or start with DataLab to get started with Python in your browser.

Learning Curve: Python is generally considered easier to learn for beginners due to its simplicity, while Java is more complex but provides a deeper understanding of how programming works.

Python alone isn't going to get you a job unless you are extremely good at it. Not that you shouldn't learn it: it's a great skill to have since python can pretty much do anything and coding it is fast and easy. It's also a great first programming language according to lots of programmers.

The point is that Java is more complicated to learn than Python. It doesn't matter the order. You will have to do some things in Java that you don't in Python. The general programming skills you learn from using either language will transfer to another.


Read on for tips on how to maximize your learning. In general, it takes around two to six months to learn the fundamentals of Python. But you can learn enough to write your first short program in a matter of minutes. Developing mastery of Python's vast array of libraries can take months or years.


6 Top Tips for Learning Python

  • Choose Your Focus. Python is a versatile language with a wide range of applications, from web development and data analysis to machine learning and artificial intelligence.
  • Practice regularly.
  • Work on real projects.
  • Join a community.
  • Don't rush.
  • Keep iterating.

The following is a step-by-step guide for beginners interested in learning Python using Windows.

  • Set up your development environment.
  • Install Python.
  • Install Visual Studio Code.
  • Install Git (optional)
  • Hello World tutorial for some Python basics.
  • Hello World tutorial for using Python with VS Code.

Best YouTube Channels to Learn Python

  • Corey Schafer.
  • sentdex.
  • Real Python.
  • Clever Programmer.
  • CS Dojo (YK)
  • Programming with Mosh.
  • Tech With Tim.
  • Traversy Media.

Python can be written on any computer or device that has a Python interpreter installed, including desktop computers, servers, tablets, and even smartphones. However, a laptop or desktop computer is often the most convenient and efficient option for coding due to its larger screen, keyboard, and mouse.

Write your first Python programStart by writing a simple Python program, such as a classic "Hello, World!" script. This process will help you understand the syntax and structure of Python code.

  • Google's Python Class.
  • Microsoft's Introduction to Python Course.
  • Introduction to Python Programming by Udemy.
  • Learn Python - Full Course for Beginners by freeCodeCamp.
  • Learn Python 3 From Scratch by Educative.
  • Python for Everybody by Coursera.
  • Learn Python 2 by Codecademy.

  • Understand why you're learning Python. Firstly, it's important to figure out your motivations for wanting to learn Python.
  • Get started with the Python basics.
  • Master intermediate Python concepts.
  • Learn by doing.
  • Build a portfolio of projects.
  • Keep challenging yourself.

Top 5 Python Certifications - Best of 2024
  • PCEP (Certified Entry-level Python Programmer)
  • PCAP (Certified Associate in Python Programmer)
  • PCPP1 & PCPP2 (Certified Professional in Python Programming 1 & 2)
  • Certified Expert in Python Programming (CEPP)
  • Introduction to Programming Using Python by Microsoft.

The average salary for Python Developer is ₹5,55,000 per year in the India. The average additional cash compensation for a Python Developer is within a range from ₹3,000 - ₹1,20,000.

The Python interpreter and the extensive standard library are freely available in source or binary form for all major platforms from the Python website, https://www.python.org/, and may be freely distributed.

If you're looking for a lucrative and in-demand career path, you can't go wrong with Python. As one of the fastest-growing programming languages in the world, Python is an essential tool for businesses of all sizes and industries. Python is one of the most popular programming languages in the world today.

line

Copyrights © 2024 letsupdateskills All rights reserved