Advertisement
Guest User

Untitled

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