Advertisement
colinm86

Untitled

Oct 13th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.45 KB | None | 0 0
  1. from node import Node
  2.  
  3. class CircularDoubleLinkedList:
  4.     """Constructor"""
  5.     def __init__(self):
  6.         self.__head = None
  7.         self.__size = 0
  8.    
  9.     @property
  10.     def head(self):
  11.         return self.__head
  12.    
  13.     @property
  14.     def size(self):
  15.         return self.__size
  16.  
  17.     @head.setter
  18.     def head(self,newref):
  19.         self.__head = newref
  20.  
  21.     @size.setter
  22.     def size(self,newsize):
  23.         self.__size = newsize
  24.  
  25.     def isEmpty(self):
  26.         """ Checks if list is empty, returns true if is false if not
  27.            Return {Boolean}
  28.        """
  29.         return self.head == None
  30.  
  31.     def getSize(self):
  32.         """[Returns size instance field]"""
  33.         return self.size
  34.  
  35.     def decrementSize(self):
  36.         '''Decreases instance field size by 1'''
  37.         if self.size < 1:
  38.             raise Exception('Size cannot less than 0')
  39.         self.size = self.size - 1
  40.  
  41.     def incrementSize(self):
  42.         '''Increases instance field size by 1'''
  43.         self.size = self.size + 1
  44.  
  45.     def search(self,item):
  46.         """Searches for object in node data fields
  47.        Arguments: item {Object}
  48.        Return: {Boolean}
  49.        """
  50.         current = self.head
  51.         found = False
  52.         while current != None and not found:
  53.             if current.getData() == item:
  54.                 found = True
  55.             else:
  56.                 current = current.getNext()
  57.         return found
  58.  
  59.     def add(self,item):
  60.         """Adds new node with item from param at the beginning of list
  61.        Arguments:
  62.            item {Object} -- item to be added
  63.        """
  64.         newnode = Node(item)
  65.         if self.isEmpty():
  66.             self.head = newnode
  67.             self.head.setPrevious(newnode)
  68.             self.head.setNext(newnode)
  69.         else:
  70.             last = self.head.getPrevious()
  71.             last.setNext(newnode)
  72.             newnode.setPrevious(last)
  73.             newnode.setNext(self.head)
  74.             self.head.setPrevious(newnode)
  75.             self.head = newnode
  76.         self.incrementSize()
  77.    
  78.     def append(self,item):
  79.         """Adds new node with item from param at the end of list
  80.        Arguments:
  81.            item {Object} -- item to be added
  82.        """
  83.         newnode = Node(item)
  84.         if self.isEmpty():
  85.             self.head = newnode
  86.             self.head.setPrevious(newnode)
  87.             self.head.setNext(newnode)
  88.         else:
  89.             last_node = self.head.getPrevious()
  90.             last_node.setNext(newnode)
  91.             newnode.setPrevious(last_node)
  92.             newnode.setNext(self.head)
  93.             self.head.setPrevious(newnode)
  94.         self.incrementSize()
  95.  
  96.     def deletefirst(self):
  97.         """Removed first node from list"""
  98.         if self.isEmpty():
  99.             raise Exception('This list is empty')
  100.         lastNode =self.head.getPrevious()
  101.         secondNode = self.head.getNext()
  102.         if self.getSize() > 1:
  103.             secondNode.setPrevious(lastNode)
  104.             lastNode.setNext(secondNode)
  105.             self.head = secondNode
  106.         else:
  107.             self.head = None
  108.         self.decrementSize()
  109.  
  110.     def pop(self):
  111.         """ Removes last item in list
  112.        Return: {Object} Last item in list
  113.        """
  114.         if self.isEmpty():
  115.             raise Exception('This list is empty')
  116.         last_node = self.head.getPrevious()
  117.         second_to_last_node = last_node.getPrevious()
  118.         if self.getSize() > 1:
  119.             self.head.setPrevious(second_to_last_node)
  120.             second_to_last_node.setNext(self.head)
  121.         else:
  122.             self.head = None
  123.         self.decrementSize()
  124.         return last_node.getData()
  125.  
  126.     def popbyindex(self,index):
  127.         """ Removes item by index pos in list
  128.        Arguments: {Integer} - index to remove item from
  129.        Return: {Object} Item in index pos from param
  130.        """
  131.         if index >= self.getSize() or index < 0:
  132.             raise IndexError('Index out of bounds')
  133.         data = None
  134.         if index == 0 :
  135.             data = self.head.getData()
  136.             self.deletefirst()
  137.                
  138.         elif index == self.getSize() -1:
  139.             data = self.pop()
  140.         else:
  141.             popnode = self.get_node(index)
  142.             beforenode = popnode.getPrevious()
  143.             afternode = popnode.getNext()
  144.             beforenode.setNext(afternode)
  145.             afternode.setPrevious(beforenode)
  146.             data = popnode.getData()
  147.             self.decrementSize()
  148.         return data
  149.  
  150.     def remove(self,item):
  151.         """ Removes item by data match in list
  152.        Arguments: {Object} - item to remove from list
  153.        """
  154.         current = self.head
  155.         found = False
  156.         index = 0
  157.         while not found and index < self.getSize():
  158.             if current.getData() == item:
  159.                 found = True              
  160.             else:
  161.                 current = current.getNext()
  162.                 index += 1  
  163.         if found:
  164.             if index == 0 :
  165.                 self.deletefirst()
  166.             elif index == self.getSize() -1:
  167.                 self.pop()
  168.             else:
  169.                 before = current.getPrevious()
  170.                 after = current.getNext()
  171.                 before.setNext(after)
  172.                 after.setPrevious(before)
  173.                 current.setNext(None)
  174.                 current.setPrevious(None)
  175.                 self.decrementSize()
  176.         else:
  177.             raise Exception('item not found')
  178.  
  179.     def get_node(self,index):
  180.         """Gets reference to node at a specified index
  181.        Arguments:
  182.            index {Integer}
  183.        """
  184.         if index < 0 or index >= self.getSize():
  185.             raise Exception("This index is out of Bounds")
  186.         current_node = self.head
  187.         i = 0
  188.         while i < index:
  189.             current_node = current_node.getNext()
  190.             i += 1
  191.         return current_node
  192.        
  193.    
  194.     def insert(self,index,item):
  195.         """Adds item to list at specific index  
  196.        Arguments:
  197.            index {Integer}
  198.            item {Object}
  199.        """
  200.         if index > self.getSize() or index < 0:
  201.             raise IndexError('Index out of bounds')
  202.         new_node = Node(item)
  203.         if self.isEmpty():
  204.             self.add(item)
  205.         elif index == self.getSize():
  206.             self.append(item)
  207.         elif index == 0:
  208.             self.add(item)
  209.         else:
  210.             beforenode = self.get_node(index).getPrevious()
  211.             afternode = beforenode.getNext()
  212.             new_node.setNext(afternode)
  213.             new_node.setPrevious(beforenode)
  214.             beforenode.setNext(new_node)
  215.             afternode.setPrevious(new_node)
  216.             self.incrementSize()
  217.  
  218.     def index(self,item):
  219.         """Looks for index of item in a list. Returns -1 if not found
  220.        Arguments:
  221.            item {Object}
  222.        Returns: {Integer} --  Index position of item or -1 if not found
  223.        """
  224.         current = self.head
  225.         current_index = 0
  226.         found = False
  227.         found_index = -1
  228.         while not found and current_index < self.getSize():
  229.             if current.getData() == item:
  230.                 found = True
  231.                 found_index = current_index
  232.             else:
  233.                 current = current.getNext()
  234.             current_index += 1
  235.         return found_index
  236.            
  237.     def __str__(self):
  238.         """ String representation of current data in list
  239.        Returns: {String}
  240.        """
  241.         string = ''
  242.         current = self.head
  243.         index = 0
  244.         while index < self.getSize():
  245.             string += f'{current.getData()},'
  246.             current = current.getNext()
  247.             index += 1
  248.         return f'[{string[:-1]}]'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement