Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.08 KB | None | 0 0
  1.  
  2. class Node:
  3.  
  4. def __init__(self, data = None, next = None, prev = None):
  5. self.data = data
  6. self.next = next
  7. self.prev = prev
  8.  
  9. class DLL:
  10.  
  11. def __init__(self):
  12. self.head = Node()
  13. self.tail = Node()
  14. self.head.next = self.tail
  15. self.tail.prev = self.head
  16. self.curr = self.tail
  17. self.size = 0
  18. self.pos = 0
  19. self.reversed = False
  20.  
  21. def insert(self, value):
  22.  
  23. new_node = Node(value)
  24. if self.reversed:
  25. new_node.next = self.curr.next
  26. new_node.prev = self.curr
  27. self.curr.next.prev = new_node
  28. self.curr.next = new_node
  29. self.curr = new_node
  30. self.size += 1
  31.  
  32. else:
  33. new_node.next = self.curr
  34. new_node.prev = self.curr.prev
  35. self.curr.prev.next = new_node
  36. self.curr.prev = new_node
  37. self.curr = new_node
  38. self.size += 1
  39.  
  40.  
  41.  
  42. def remove(self):
  43.  
  44. if self.curr != self.head and self.curr != self.tail:
  45. self.curr.next.prev = self.curr.prev
  46. self.curr.prev.next = self.curr.next
  47. self.size -= 1
  48. if self.reversed:
  49. self.curr = self.curr.prev
  50. else:
  51. self.curr = self.curr.next
  52. else:
  53. return
  54.  
  55. def get_value(self):
  56.  
  57. return self.curr.data
  58.  
  59. def move_to_next(self):
  60.  
  61. if self.reversed:
  62. if self.curr.prev != None:
  63. self.curr = self.curr.prev
  64. self.pos -= 1
  65.  
  66.  
  67. else:
  68. if self.curr.next != None:
  69. self.curr = self.curr.next
  70. self.pos += 1
  71. #print('EKKKI Next REVERSE POS: ', self.pos)
  72.  
  73. def move_to_prev(self):
  74.  
  75. if self.reversed:
  76. if self.curr.next != self.tail:
  77. self.curr = self.curr.next
  78. self.pos += 1
  79. print('POS' ,self.pos)
  80.  
  81. else:
  82. return
  83.  
  84. else:
  85. if self.curr.prev != self.head:
  86. self.curr = self.curr.prev
  87. self.pos -= 1
  88. print('POS' ,self.pos)
  89.  
  90. else:
  91. return
  92.  
  93. def move_to_pos(self, position):
  94.  
  95. if position > self.size or position < 0:
  96. return
  97.  
  98. if self.pos == position:
  99. return
  100.  
  101. if position == self.size:
  102. self.curr = self.tail
  103. if self.reversed:
  104. self.pos = 0
  105. else:
  106. self.pos = self.size
  107.  
  108.  
  109. else:
  110. if position > self.pos: # move next
  111. while self.pos != position:
  112. self.move_to_next()
  113. #self.move_to_pos(position)
  114.  
  115. elif position < self.pos: # move prev
  116. while self.pos != position:
  117. self.move_to_prev()
  118. #print('PREv')
  119. #print(position,': BIL :',self.pos)
  120. #self.move_to_pos(position)
  121.  
  122. else:
  123. return
  124.  
  125. def remove_all(self, value):
  126.  
  127. if self.reversed:
  128. iterator = self.tail.prev
  129.  
  130. if self.curr.data == value:
  131. self.curr = self.tail.prev
  132.  
  133. else:
  134. iterator = self.head.next
  135.  
  136. if self.curr.data == value:
  137. self.curr = self.head.next
  138.  
  139. while iterator != None:
  140.  
  141. if iterator.data == value:
  142. iterator.prev.next = iterator.next
  143. iterator.next.prev = iterator.prev
  144. self.size -= 1
  145.  
  146. if self.reversed:
  147. iterator = iterator.prev
  148. else:
  149. iterator = iterator.next
  150.  
  151. if self.reversed:
  152.  
  153. if self.curr.data == value:
  154. self.curr = self.tail.prev
  155.  
  156. else:
  157.  
  158. if self.curr.data == value:
  159. self.curr = self.head.next
  160.  
  161. def reverse(self):
  162.  
  163. if self.reversed:
  164. self.reversed = False
  165. self.curr = self.head.next
  166. self.pos = 0
  167.  
  168. else:
  169. self.reversed = True
  170. self.curr = self.tail.prev
  171. self.pos = self.size - 1
  172.  
  173. def sort(self):
  174.  
  175. if self.head.next == self.tail:
  176. return
  177.  
  178. else:
  179. self.curr = self.head.next
  180.  
  181. while self.curr.next != None:
  182. compare = self.curr.next
  183. while compare.next != None:
  184. if self.curr.data > compare.data:
  185. temp = self.curr.data
  186. self.curr.data = compare.data
  187. compare.data = temp
  188.  
  189. compare = compare.next
  190. self.curr = self.curr.next
  191.  
  192. self.reversed = False
  193. self.curr = self.head.next
  194. if self.reversed:
  195. self.pos = self.size
  196. else:
  197. self.pos = 0
  198.  
  199. def __len__(self):
  200.  
  201. return self.size
  202.  
  203. def __str__(self):
  204.  
  205. ret_str = ''
  206.  
  207. if self.reversed:
  208. ret_val = self.tail.prev
  209. while ret_val.prev != None:
  210. ret_str += str(ret_val.data) + ' '
  211. ret_val = ret_val.prev
  212.  
  213. else:
  214. ret_val = self.head.next
  215. while ret_val.next != None:
  216. ret_str += str(ret_val.data) + ' '
  217. ret_val = ret_val.next
  218.  
  219. return ret_str
  220.  
  221. def getStatus(self):
  222. return self.reversed
  223.  
  224. def getPos(self):
  225. return self.pos
  226.  
  227.  
  228. '''
  229. dll = DLL()
  230. dll.insert(29)
  231. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  232. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  233. dll.move_to_next()
  234. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  235. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  236. dll.insert(18)
  237. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  238. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  239. dll.insert(24)
  240. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  241. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  242. dll.insert(24)
  243. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  244. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  245. dll.move_to_pos(-1)
  246. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  247. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  248. dll.move_to_prev()
  249. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  250. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  251. dll.move_to_pos(2)
  252. print('reversed: ' + str(dll.getStatus()) + ' - pos: ' + str(dll.getPos()))
  253. print('value: ' + str(dll.get_value()) + ' - size: ' + str(len(dll)))
  254. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement