Update 1-linked-list/linked-list.py
This commit is contained in:
parent
1af8bd1e54
commit
049df3c8c2
@ -1,132 +1,7 @@
|
||||
class Node:
|
||||
def __init__( self, payLoad, next=None ):
|
||||
self.payLoad = payLoad
|
||||
self.next = next
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
class LinkedList:
|
||||
head = None
|
||||
def __init__( self, *args ):
|
||||
for item in args:
|
||||
self.insert( item )
|
||||
|
||||
# allow print to work correctly.
|
||||
# def __str__(self):
|
||||
# return self.print()
|
||||
|
||||
# allow += and + operates to work correctly
|
||||
def __add__( self, item ):
|
||||
self.insert( item )
|
||||
|
||||
return self
|
||||
|
||||
# allow the in operator to work
|
||||
def __iter__(self):
|
||||
current = self.head
|
||||
|
||||
while current:
|
||||
yield current.payLoad
|
||||
current = current.next
|
||||
|
||||
# allow the len() function to be used
|
||||
def __len__( self ):
|
||||
return self.find( None )['count']
|
||||
|
||||
# internal method check if node is a node object
|
||||
def __check_Node( self, node ):
|
||||
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.head
|
||||
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, item, after=None ):
|
||||
# check to see if adding a whole LinkedList
|
||||
if isinstance(item, self.__class__):
|
||||
self.find(None)['last'].next = item.head
|
||||
return self
|
||||
|
||||
item = self.__check_Node( item )
|
||||
|
||||
# figures out the position of the node
|
||||
previous_node = self.find(after)['current'] if after else self.find(None)['last']
|
||||
|
||||
# if the after node isnt found, do nothing.
|
||||
if not previous_node: return None;
|
||||
|
||||
item.next = previous_node.next
|
||||
previous_node.next = item
|
||||
|
||||
return item
|
||||
|
||||
def print_right( self ):
|
||||
|
||||
def rec( current ):
|
||||
if not current: return 'None'
|
||||
return rec( current.next ) + ' <= ' + current.payLoad
|
||||
|
||||
return( rec( self.head ) + ' <= head' )
|
||||
|
||||
def __str__( self ):
|
||||
current = self.head
|
||||
out = 'head' + ' => '
|
||||
|
||||
while current:
|
||||
out += current.payLoad + ' => '
|
||||
current = current.next
|
||||
|
||||
return out + 'None'
|
||||
|
||||
def __repr__( self ):
|
||||
return self.__str__()
|
||||
|
||||
def delete( self, payLoad ):
|
||||
match, before, count = self.find( payLoad )
|
||||
if match:
|
||||
before.next = match.next
|
||||
return match
|
||||
|
||||
return None
|
||||
|
||||
if __name__ == '__main__':
|
||||
l2 = LinkedList('a')
|
||||
l2.insert('b')
|
||||
l2.insert('c')
|
||||
l2 += Node('d')
|
||||
l2.insert('1', 'c')
|
||||
print(l2)
|
||||
|
||||
l = LinkedList( Node('1') )
|
||||
l.insert( Node('2'))
|
||||
l.insert( Node('3'))
|
||||
l.insert( Node('4'))
|
||||
l += Node('5')
|
||||
l.insert('a')
|
||||
l3 = l + l2
|
||||
print( l.print_right() )
|
||||
def __init__(self):
|
||||
pass
|
Loading…
x
Reference in New Issue
Block a user