Data Structures in Python 🐍2️⃣ Singly Linked List

Utkarsh Trehan
4 min readOct 1, 2021

--

What is Singly Linked List🤔

🤯➡️🌗➡️🌗️➡️🌗➡️🌗➡️🌗➡️🕳️
Every linked list consists of nodes🌗, each node has two components:
1. Data 🌕 which allows to store an element of data.
2. Next 🌑 which stores a pointer that points from one node to another.
Start of the element is called head🤯, that points to the beginning of the linked list. The last node in a singly linked list points to None🕳️, and that tells you that it’s the end of the linked list.

Implementation 🧑🏻‍💻

We start by creating a class LinkedList

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

1. Insertion

Now we will look at insertion: we can do insertion in different ways like append, prepend or insert after node. To start with insertion we need node.
We will create a class Node🌗.

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

Now we will look at append method

def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
return
current_node = self.head
while current_node.next:
current_node = current_node.next
current_node.next = new_node

Seems good till now 🤔 We need to check the content of the linked list. For this, we will implement a new function print_list method

def print_list(self):
current_node = self.head
while current_node:
print(current_node.data)
current_node = current_node.next

Now we will look at prepend method where we insert an element at the beginning of the linked list.

def prepend(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node

2. Deletion 🗑️

We will implement deletion by value and deletion by position.
Let’s start by deletion_by_value method.

def deletion_by_value(self, value):
current_node = self.head

if current_node and current_node.data == value:
self.head = current_node.next
current_node = None
return

previous_node = None
while current_node and current_node.data != value:

previous_node = current_node
current_node = current_node.next

if current_node is None:
return
previous_node.next = current_node.next
current_node = None

We will implement deletion by value and deletion by position.
Let’s start by deletion_by_position method.

def deletion_by_position(self, pos):

if self.head:
current_node = self.head
if pos == 0:
self.head = current_node.next
current_node = None
return

count = 0
previous_node = None
while current_node and count != pos:
previous_node = current_node
current_node = current_node.next
count += 1

if current_node is None:
return

previous_node.next = current_node.next
current_node = None

3. Length 🦒

We will now implement length method to calculate the length or the number of nodes in a given linked list

def length(self):
current_node = self.head
length = 0
while current_node:
length+=1
current_node = current_node.next
return length

4. Node Swap 💫

Now let’s look at the task of swapping nodes, we will swap the nodes that contains specific keys.

def swap_nodes(self, key_1, key_2):
if key_1 == key_2:
return

current_node_1 = self.head
previous_node_1 = None
while current_node_1 and current_node_1.data != key_1:
previous_node_1 = current_node_1
current_node_1 = current_node_1.next

current_node_2 = self.head
previous_node_2 = None
while current_node_2 and current_node_2.data != key_2:
previous_node_2 = current_node_2
current_node_2 = current_node_2.next

if not current_node_1 or not current_node_2:
return

if previous_node_1:
previous_node_1.next = current_node_2
else:
self.head = current_node_2

if previous_node_2:
previous_node_2.next = current_node_1
else:
self.head = current_node_1

current_node_1.next, current_node_2.next = current_node_2.next, current_node_1.next

5. Reverse 🔀

let’s reverse a singly linked list now.
🤯➡️🌗➡️🌗️➡️🌗➡️🌗➡️🕳️
🕳️⬅️🌗⬅️🌗⬅️🌗⬅️🌗⬅️🤯

def reverse(self):
current_node = self.head
previous_node = None
while current_node:
next = current_node.next
current_node.next = previous_node
previous_node = current_node
current_node = next
self.head = previous_node

Wrapping Up

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

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

def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
return
current_node = self.head
while current_node.next:
current_node = current_node.next
current_node.next = new_node

def prepend(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node

def deletion_by_value(self, value):
current_node = self.head

if current_node and current_node.data == value:
self.head = current_node.next
current_node = None
return

previous_node = None
while current_node and current_node.data != value:

previous_node = current_node
current_node = current_node.next

if current_node is None:
return
previous_node.next = current_node.next
current_node = None

def deletion_by_position(self, pos):

if self.head:
current_node = self.head
if pos == 0:
self.head = current_node.next
current_node = None
return

count = 0
previous_node = None
while current_node and count != pos:
previous_node = current_node
current_node = current_node.next
count += 1

if current_node is None:
return

previous_node.next = current_node.next
current_node = None

def length(self):
current_node = self.head
length = 0
while current_node:
length+=1
current_node = current_node.next
return length

def swap_nodes(self, key_1, key_2):
if key_1 == key_2:
return

current_node_1 = self.head
previous_node_1 = None
while current_node_1 and current_node_1.data != key_1:
previous_node_1 = current_node_1
current_node_1 = current_node_1.next

current_node_2 = self.head
previous_node_2 = None
while current_node_2 and current_node_2.data != key_2:
previous_node_2 = current_node_2
current_node_2 = current_node_2.next

if not current_node_1 or not current_node_2:
return

if previous_node_1:
previous_node_1.next = current_node_2
else:
self.head = current_node_2

if previous_node_2:
previous_node_2.next = current_node_1
else:
self.head = current_node_1

current_node_1.next, current_node_2.next = current_node_2.next, current_node_1.next

def reverse(self):
current_node = self.head
previous_node = None
while current_node:
next = current_node.next
current_node.next = previous_node
previous_node = current_node
current_node = next
self.head = previous_node

def print_list(self):
current_node = self.head
while current_node:
print(current_node.data)
current_node = current_node.next

Next Up⏭️: Circular linked list

--

--