linkedlist.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from typing import Union, Any
  2. from dataclasses import dataclass
  3. class ListIsEmpty(Exception):
  4. pass
  5. @dataclass
  6. class Node:
  7. value: Any
  8. next_: Any
  9. class LinkedList:
  10. def __init__(self):
  11. self.__head: Union[None, Node] = None
  12. def __getitem__(self, n: int) -> Any:
  13. if self.__head is None:
  14. raise ListIsEmpty()
  15. i = 0
  16. ptr = self.__head
  17. while i < n:
  18. if ptr.next_ is None:
  19. raise IndexError()
  20. i += 1
  21. ptr = ptr.next_
  22. return ptr.value
  23. def __setitem__(self, n: int, value: Any):
  24. ptr = self.__head
  25. for i in range(n):
  26. ptr = ptr.next_
  27. print(f"At {i}")
  28. ptr.value = value
  29. def index(self, value: Any) -> int:
  30. ptr = self.__head
  31. i = 0
  32. while True:
  33. if ptr.value == value:
  34. return i
  35. else:
  36. i += 1
  37. ptr = ptr.next_
  38. if ptr is None:
  39. break
  40. raise ValueError()
  41. def append(self, value: Any):
  42. ptr = self.__head
  43. if ptr is None:
  44. self.__head = Node(value=value, next_=None)
  45. return
  46. while True:
  47. if ptr.next_ is None:
  48. break
  49. ptr = ptr.next_
  50. ptr.next_ = Node(value, next_=None)
  51. def prepend(self, value: Any):
  52. new_node = Node(value=value, next_=self.__head)
  53. self.__head = new_node