fork download
  1.  
  2. class Node(object):
  3.  
  4. def __init__(self,d):
  5. self.next_node = None
  6. self.prev_node = None
  7. self.data = d
  8.  
  9. class DoublyLinkedList(object):
  10.  
  11. def __init__(self):
  12. self.head = None
  13. self.tail = None
  14. self.size = 0
  15.  
  16. def add(self,d):
  17. new_node = Node(d)
  18. if self.tail:
  19. self.tail.next_node = new_node
  20. new_node.next_node = None
  21. new_node.prev_node = self.tail
  22. self.tail=new_node
  23. else:
  24. self.head = new_node
  25. self.tail = new_node
  26. new_node.prev_node = None
  27. self.size+=1
  28.  
  29. def addBeg(self,d):
  30. new_node = Node(d)
  31. current_node = self.head
  32. current_node.prev_node = new_node
  33. new_node.prev_node = None
  34. new_node.next_node = current_node
  35. self.head = new_node
  36. self.size+=1
  37.  
  38. def add_at(self,d,index):
  39. new_node = Node(d)
  40. previous_node = None
  41. current_node = self.head
  42. i = 0
  43. while i<index and current_node:
  44. previous_node = current_node
  45. current_node = current_node.next_node
  46. i+=1
  47. #once it reaches the desired index
  48. if i==index:
  49. previous_node.next_node = new_node
  50. new_node.prev_node = previous_node
  51. new_node.next_node = current_node
  52. current_node.prev_node = new_node
  53. self.size+=1
  54. return True
  55. else:
  56. return False #list ain't too long
  57.  
  58.  
  59. def remove(self,d):
  60. previous_node = None
  61. current_node = self.head
  62. while current_node:
  63. if current_node.data == d:
  64. if previous_node: #the node is somewhere in between
  65. #print(d)
  66. previous_node.next_node = current_node.next_node
  67. if current_node.next_node is None: #deleting last node
  68. current_node.prev_node=None
  69. else:
  70. current_node.next_node.prev_node = previous_node
  71. else:
  72. #it is the first node
  73. self.head = current_node.next_node
  74. current_node.next_node.prev_node = None
  75. self.size -= 1
  76. return True
  77.  
  78. previous_node = current_node
  79. current_node = current_node.next_node
  80. return False
  81.  
  82. def search(self,d):
  83. current_node = self.head
  84. while current_node:
  85. if current_node.data == d:
  86. return True
  87. current_node = current_node.next_node
  88. return False
  89.  
  90. #traverse through the linked list and store the elements in a list
  91. def to_list(self):
  92. lis = []
  93. current_node = self.head
  94. while current_node:
  95. lis.append(current_node.data)
  96. current_node = current_node.next_node
  97. return lis
  98.  
  99. dll = DoublyLinkedList()
  100. dll.add(40)
  101. dll.add(50)
  102. dll.add(60)
  103. print(dll.to_list())
  104. dll.add(70)
  105. print(dll.to_list())
  106. dll.remove(50)
  107. print(dll.to_list())
  108. dll.remove(70)
  109. print(dll.to_list())
  110. dll.remove(40)
  111. print(dll.to_list())
  112.  
Success #stdin #stdout 0s 23304KB
stdin
stdout
[40, 50, 60]
[40, 50, 60, 70]
[40, 60, 70]
[40, 60]
[60]