Created
January 10, 2017 17:58
-
-
Save wmantly/10c5bccad407e5e2beacb578bab37d5b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class Node: | |
| def __init__(self, payLoad, next=None): | |
| self.payLoad = payLoad | |
| self.next = next | |
| def __str__(self): | |
| return str(self.payLoad) | |
| def __repr__(self): | |
| return self.__str__() | |
| class LinkedList: | |
| def __init__(self, item): | |
| self.next = self.next = self.__check_Node(item) | |
| self.head = self.next | |
| def __repr__(self): | |
| return self.__str__() | |
| def __add__(self, item): | |
| '''allow += and + operates to work correctly''' | |
| if item is self: return False | |
| self.push( item ) | |
| return self | |
| def __iter__(self): | |
| '''allow the in operator to work''' | |
| current = self.next | |
| while isinstance(current, Node): | |
| yield current | |
| current = current.next | |
| def __len__(self): | |
| '''allow the len() function to be used''' | |
| return self.find( None )['count'] | |
| def __str__(self): | |
| '''allow print to work correctly''' | |
| current = self.next | |
| out = 'Head' + ' => ' | |
| for current in self: | |
| # while current: | |
| out += str(current.payLoad) + ' => ' | |
| current = current.next | |
| return out + 'None' | |
| def __check_Node(self, node): | |
| '''internal method check if node is a node object''' | |
| if isinstance(node, self.__class__): | |
| return node.head | |
| if not isinstance(node, Node): | |
| return Node(node) | |
| return node | |
| def find(self, match): | |
| ''' Searches the list for a matching node. If found it will return the | |
| current node, last node as Node objects and position as an int. | |
| If nothing is found, it will return None, the last node as a Node | |
| object, and the full length of the list as an int. | |
| This function will **ONLY** return the first match. | |
| setting match to None will find the end of the list and return the | |
| last node as return['last'] | |
| This method does alot of the heavy lifting. | |
| ''' | |
| current = self.next | |
| last = None | |
| count = 0 | |
| while current: | |
| if current.payLoad == match: | |
| return {'current': current, 'last': last, 'count': count} | |
| last = current | |
| current = current.next | |
| count += 1 | |
| return {'current': current, 'last': last, 'count': count} | |
| def insert(self, *items, after=False): | |
| # figures out the position of the node | |
| previous_node = self.find(after)['current'] if after != False else self | |
| for item in items[:: -1]: | |
| if isinstance(item, self.__class__): | |
| item = item.next | |
| item = self.__check_Node( item ) | |
| item.next = previous_node.next | |
| previous_node.next = item | |
| return self | |
| def push(self, item): | |
| last_node = self.find(None)['last'] | |
| node = self.__check_Node(item) | |
| last_node.next = node; | |
| def print_right(self): | |
| def rec(current): | |
| if not current: return 'None' | |
| return rec( current.next ) + ' <= ' + current.payLoad | |
| return rec( self.next ) + ' <= Head' | |
| def delete(self, payLoad): | |
| match = self.find( payLoad ) | |
| if match['current']: | |
| match['last'].next = match['current'].next | |
| return match['current']; | |
| return None | |
| if __name__ == '__main__': | |
| ''' Some testing stuff ''' | |
| l1 = LinkedList('b') | |
| l1.insert('a') | |
| l1.push('c') | |
| print(l1) | |
| l2 = LinkedList('1') | |
| l2.push('2') | |
| print(l2) | |
| l1 +=l2 | |
| print(l1) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment