See all coding puzzles and patterns here.
- Difficulty: Easy
Problem Definition
Given a linked list and an index in the linked list, write a function to delete the given index from the linked list. Assume the index starts at 0 for the first item in the linked list.
Node Class
This is the class that represents each node in the linked list.class Node:
def __init__(self, val, nxt: 'Node' = None):
self.val = val
self.nxt = nxt
Examples
Some test cases to verify our solution.# 0->1->2->3->4->5
root = Node(0, Node(1, Node(2, Node(3, Node(4, Node(5))))))
assert root.to_list() == [0, 1, 2, 3, 4, 5]
delete_index(root, 1)
# Should now be 0->2->3->4->5
assert root.to_list() == [0, 2, 3, 4, 5]
delete_index(root, 0)
# Should now be 2->3->4->5
assert root.to_list() == [2, 3, 4, 5]
delete_index(root, 3)
# Should now be 2->3->4
assert root.to_list() == [2, 3, 4]
Solution
We will maintain a counter as we traverse the linked list. Once we have hit our targetidx, we will break out of the loop and remove the current Node
from the linked list.
def delete_index(head: Node, idx: int):
curr_idx = 0
prev = None
while curr_idx != idx and head is not None:
prev = head
head = head.nxt
curr_idx += 1
if curr_idx == idx:
nxt = head.nxt
prev.nxt = nxt
else:
raise IndexError(f"{idx} out of range, max length is {curr}.")
Complexity
Let $n =$ length of the linked list.
Since we are looking at each element once, the runtime complexity should be $O(n)$.
Auxiliary space complexity should be $O(1)$ since we are storing just a handful of temporary variables.

