Advertisement
Guest User

Doubly Linked List

a guest
Oct 22nd, 2015
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. class DoublyLinkedNode():
  2. def __init__(self,value,previousNode=None,nextNode=None):
  3. self.value = value
  4. self.previousNode = previousNode
  5. self.nextNode = nextNode
  6.  
  7. def get(self):
  8. return self.value
  9.  
  10. def __str__(self):
  11. return str(self.get())
  12.  
  13. def next(self):
  14. return self.nextNode
  15.  
  16. def previous(self):
  17. return self.previousNode
  18.  
  19. def setNextNode(self,nextNode):
  20. self.nextNode = nextNode
  21.  
  22. def setPreviousNode(self,previousNode):
  23. self.previousNode = previousNode
  24.  
  25. class DoublyLinkedList():
  26. def __init__(self):
  27. self.head = None
  28. self.tail = None
  29. self.size = 0
  30.  
  31. def __len__(self):
  32. return self.size
  33.  
  34. def __str__(self):
  35. if self.__len__() == 0:
  36. return "[]"
  37. else:
  38. theString = "["
  39. currentNode = self.head
  40. while currentNode != None:
  41. theString += str(currentNode)
  42. if currentNode.next() != None:
  43. theString += ", "
  44. currentNode = currentNode.next()
  45. theString += "]"
  46. return theString
  47.  
  48.  
  49. def _findNode(self,index):
  50. if (index + 1) > self.__len__() or (index < 0 and -index > self.__len__()):
  51. raise IndexError("List index out of range")
  52. elif index < 0:
  53. current = self.tail
  54. for i in range(-(index+1)):
  55. current = current.previous()
  56. else:
  57. current = self.head
  58. for i in range(index):
  59. current = current.next()
  60. return current
  61.  
  62. def append(self,value):
  63. if self.head != None:
  64. newNode = DoublyLinkedNode(value,self.tail)
  65. self.tail.setNextNode(newNode)
  66. else:
  67. newNode = DoublyLinkedNode(value)
  68. self.head = newNode
  69. self.tail = newNode
  70. self.size += 1
  71.  
  72. def insert(self,index,value):
  73. if (index+2) > self.__len__() or (index < 0 and -(index-1) > self.__len__()): # if past the start or end of the list, defaults to last or first
  74. if index < 0:
  75. oldHead = self.head
  76. newNode = DoublyLinkedNode(value,nextNode=oldHead)
  77. oldHead.setPreviousNode(newNode)
  78. self.head = newNode
  79. elif index > 0:
  80. oldTail = self.tail
  81. newNode = DoublyLinkedNode(value,oldTail)
  82. oldTail.setNextNode(newNode)
  83. self.tail = newNode
  84.  
  85. else:
  86. if index > 0:
  87. nextNode = self._findNode(index)
  88. previousNode = nextNode.previous()
  89. newNode = DoublyLinkedNode(value,previousNode,nextNode)
  90. previousNode.setNextNode(newNode)
  91. nextNode.setPreviousNode(newNode)
  92. self.size += 1
  93.  
  94. def pop(self,index):
  95. theNode = self._findNode(index)
  96. if theNode.previous() != None:
  97. theNode.previous().setNextNode(theNode.next())
  98. if theNode.next() != None:
  99. theNode.next().setPreviousNode(theNode.previous())
  100. self.size -= 1
  101. return theNode.get()
  102.  
  103. def __iter__(self):
  104. self.index = 0
  105. return (self)
  106.  
  107. def next(self):
  108. try:
  109. result = self._findNode(self.index).get()
  110. except IndexError:
  111. self.index = 0
  112. raise StopIteration
  113. self.index += 1
  114. return result
  115.  
  116. def __getitem__(self, item):
  117. return self._findNode(item).get()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement