Python/data_structures/linked_list/__init__.py

85 lines
2.1 KiB
Python
Raw Normal View History

"""
Linked Lists consists of Nodes.
Nodes contain data and also may link to other nodes:
- Head Node: First node, the address of the
head node gives us access of the complete list
- Last node: points to null
"""
from __future__ import annotations
from typing import Any
2018-10-19 12:48:28 +00:00
class Node:
def __init__(self, item: Any, next: Any) -> None:
2018-10-19 12:48:28 +00:00
self.item = item
self.next = next
2019-10-05 05:14:13 +00:00
2018-10-19 12:48:28 +00:00
class LinkedList:
def __init__(self) -> None:
self.head: Node | None = None
self.size = 0
2018-10-19 12:48:28 +00:00
def add(self, item: Any) -> None:
2018-10-19 12:48:28 +00:00
self.head = Node(item, self.head)
self.size += 1
2018-10-19 12:48:28 +00:00
def remove(self) -> Any:
# Switched 'self.is_empty()' to 'self.head is None'
# because mypy was considering the possibility that 'self.head'
# can be None in below else part and giving error
if self.head is None:
2018-10-19 12:48:28 +00:00
return None
else:
item = self.head.item
self.head = self.head.next
self.size -= 1
2018-10-19 12:48:28 +00:00
return item
def is_empty(self) -> bool:
2018-10-19 12:48:28 +00:00
return self.head is None
def __str__(self) -> str:
"""
>>> linked_list = LinkedList()
>>> linked_list.add(23)
>>> linked_list.add(14)
>>> linked_list.add(9)
>>> print(linked_list)
9 --> 14 --> 23
"""
if not self.is_empty:
return ""
else:
iterate = self.head
item_str = ""
item_list: list[str] = []
while iterate:
item_list.append(str(iterate.item))
iterate = iterate.next
item_str = " --> ".join(item_list)
return item_str
def __len__(self) -> int:
"""
>>> linked_list = LinkedList()
>>> len(linked_list)
0
>>> linked_list.add("a")
>>> len(linked_list)
1
>>> linked_list.add("b")
>>> len(linked_list)
2
>>> _ = linked_list.remove()
>>> len(linked_list)
1
>>> _ = linked_list.remove()
>>> len(linked_list)
0
"""
return self.size