Thursday, 20 March 2014

Week 7: Linked List

class LinkedList:
    
    def __init__(self: 'LinkedList', head: object = None, 
                 rest: 'LinkedList' = None) -> None:
        '''
        Attributes of LinkedList:
        1. self.item
        2. self.rest
        3. self.empty
        '''
        self.empty = (head is None) and (rest is None)
        if not self.empty:
            self.item = head
            if rest:
                self.rest = rest
            else: 
                self.rest = LinkedList()
    
    def prepend(self: 'LinkedList', item: object) -> None:
        ''' Add new item to front of self'''
       
        self.empty = False
        self.rest = copy(self)
        self.item = item
        
        
    def decapitate(self: 'LinkedList') -> None:
        ''' Delete item off from front of self'''
        
        if self.empty: # 0 items in LinkedList => no head, no rest
            raise Exception("Can't decapitate empty list!")
        
        elif self.rest.empty: # 1 item in LinkedList => yes head, no rest
            self.empty = True
            del(self.item)
            del(self.rest)
            
        else: # more than 2 items in LinkedList
            self.item = self.rest.item
            self.rest = self.rest.rest
        
    def _contains_(self: 'LinkedList', value: object) -> bool:
        ''' Returns if value is in self 

        3 POSSIBILITIES:

            1. self.empty -> value not in LinkedList -> return False
            2. return if self.item == value
            3. return if value is in self.rest
        '''
        
        return (not self.empty) and (self.item == value or value in self.rest)
        
        
    def __get_item__(self: 'LinkedList', ind:int) -> object:
        ''' Returns item at index ind '''
        
        if self.empty or ind < 0:
            raise IndexError
        elif ind > 0:
            return self.rest.__get_item__(ind - 1)
        else: # ind == 0
            return self.item
        
    def __repr__(self: 'LinkedList'):
        
        if self.empty:
            return 'LinkedList()'
        else:
            return ('LinkedList({}, {})'.format(repr(self.item), repr(self.rest)))