class Node():
def __init__(self, data):
self.data=data
self.next_node=None
class LinkedList():
def __init__(self, first_node:Node|None=None):
self.first_node: Node|None = first_node
1. Setup Linkedlist
and Node
Objects
Previously introduced.
=Node("Hey")
node0=Node("I")
node1=Node("Just")
node2=Node("Met")
node3=node1
node0.next_node=node2
node1.next_node=node3 node2.next_node
2. Read
from LinkedList
Previously introduced
2.1 Read(0)
or Top
def read_top_ll(linked_list: LinkedList, index: int):
= linked_list.first_node
current_node return current_node.data
= LinkedList(node0)
ll 0) read_top_ll(ll,
'Hey'
2.2 Read
Index of LinkedList
2.3 Add Base-Case: Read(0)
def read_ll_forloop(linked_list: LinkedList, index: int):
= linked_list.first_node
current_node
if index==0:
return current_node.data
for i in range(index+1):
print(i)
if i==index:
return current_node.data
=current_node.next_node
current_nodereturn None
= LinkedList(node0)
ll 0) read_ll_forloop(ll,
'Hey'
2.4 Read(1)
def read_ll_whileloop(linked_list: LinkedList, index: int):
= linked_list.first_node
current_node
if index==0:
return current_node.data
=0
iwhile current_node: # for i in range(index+1):
if i==index:
return current_node.data
=current_node.next_node
current_node+=1
ireturn None
= LinkedList(node0)
ll 1) read_ll_whileloop(ll,
'I'
2.5 Read
All - LinkedList
to Python List
def read_all_ll_whileloop(linked_list: LinkedList):
= linked_list.first_node
current_node = []
ll_list while current_node: # for i in range(index+1):
ll_list.append(current_node.data)=current_node.next_node
current_node
return ll_list
= LinkedList(node0)
ll read_all_ll_whileloop(ll)
['Hey', 'I', 'Just', 'Met']
3. Insert
from LinkedList
3.1 Insert(0)
or Top
def insert_front_ll_forloop(linked_list: LinkedList, index: int,
new_node: Node):
= linked_list.first_node
current_node if index==0:
= current_node
new_node.next_node =new_node
linked_list.first_node
# for i in range(index+1):
# print(i)
# if i==index:
# return current_node.data
# current_node=current_node.next_node
# return None
= LinkedList(node0)
ll 0,Node("mate"))
insert_front_ll_forloop(ll,print(read_all_ll_whileloop(ll))
['mate', 'Hey', 'I', 'Just', 'Met']
3.2 Create New LinkedList
for Each Test
def reset_ll():
=Node("Hey")
node0=Node("I")
node1=Node("Just")
node2=Node("Met")
node3=node1
node0.next_node=node2
node1.next_node=node3
node2.next_node= LinkedList(node0)
ll return ll
3.3 Insert(Index)
3.3.1 Insert(Index)
: for
-loop version
def insert_ll_forloop(linked_list: LinkedList, index: int,
new_node: Node):
= linked_list.first_node
current_node if index==0:
= current_node
new_node.next_node =new_node
linked_list.first_node
for i in range(index+1):
if i==index-1:
= current_node.next_node
new_node.next_node = new_node
current_node.next_node # return current_node.data
=current_node.next_node
current_nodereturn None
= reset_ll()
ll 0,Node("YOU"))
insert_ll_forloop(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 1,Node("YOU"))
insert_ll_forloop(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 2,Node("YOU"))
insert_ll_forloop(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 3,Node("YOU"))
insert_ll_forloop(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 4,Node("YOU"))
insert_ll_forloop(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN")
5,Node("YOU")) # OUT OF INDEX ERROR EXPECTED
insert_ll_forloop(ll,print(read_all_ll_whileloop(ll))
#hey i just met
['YOU', 'Hey', 'I', 'Just', 'Met']
['Hey', 'YOU', 'I', 'Just', 'Met']
['Hey', 'I', 'YOU', 'Just', 'Met']
['Hey', 'I', 'Just', 'YOU', 'Met']
['Hey', 'I', 'Just', 'Met', 'YOU']
OUT-OF-INDEX ERROR EXPECTED NEXT RUN
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[41], line 39 37 ll = reset_ll() 38 print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN") ---> 39 insert_ll_forloop(ll,5,Node("YOU")) # OUT OF INDEX ERROR EXPECTED 40 print(read_all_ll_whileloop(ll)) 42 #hey i just met Cell In[41], line 11, in insert_ll_forloop(linked_list, index, new_node) 9 for i in range(index+1): 10 if i==index-1: ---> 11 new_node.next_node = current_node.next_node 12 current_node.next_node = new_node 13 # return current_node.data AttributeError: 'NoneType' object has no attribute 'next_node'
3.3.2 Insert(Index)
: while
-loop version 1 (No Out-of-Index Error)
def insert_ll_WHILELOOP_v1(linked_list: LinkedList, index: int,
new_node: Node):
= linked_list.first_node
current_node if index==0:
= current_node
new_node.next_node =new_node
linked_list.first_node=0
iwhile current_node:
if i==index-1:
= current_node.next_node
new_node.next_node = new_node
current_node.next_node =current_node.next_node
current_node+=1
ireturn None
= reset_ll()
ll print(read_all_ll_whileloop(ll))
0,Node("YOU"))
insert_ll_WHILELOOP_v1(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 1,Node("YOU"))
insert_ll_WHILELOOP_v1(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 2,Node("YOU"))
insert_ll_WHILELOOP_v1(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 3,Node("YOU"))
insert_ll_WHILELOOP_v1(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 4,Node("YOU"))
insert_ll_WHILELOOP_v1(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll print("NO ERROR EXPECTED NEXT RUN DESPITE OUT OF INDEX - NEED TO UPDATE FN")
5,Node("YOU")) # ERROR EXPECTED BUT NO ERROR DUE TO while current_node
insert_ll_WHILELOOP_v1(ll,print(read_all_ll_whileloop(ll))
['Hey', 'I', 'Just', 'Met']
['YOU', 'Hey', 'I', 'Just', 'Met']
['Hey', 'YOU', 'I', 'Just', 'Met']
['Hey', 'I', 'YOU', 'Just', 'Met']
['Hey', 'I', 'Just', 'YOU', 'Met']
['Hey', 'I', 'Just', 'Met', 'YOU']
NO ERROR EXPECTED NEXT RUN DESPITE OUT OF INDEX - NEED TO UPDATE FN
['Hey', 'I', 'Just', 'Met']
3.3.3 Insert(Index)
: while
-loop version 2 (Includes Out-of-Index Error)
def insert_ll_WHILELOOP(linked_list: LinkedList, index: int,
new_node: Node):
= linked_list.first_node
current_node if index==0:
= current_node
new_node.next_node =new_node
linked_list.first_nodereturn None
=0
iwhile i<index-1:
=current_node.next_node
current_node+=1
i# print(current_node.data)
= current_node.next_node
new_node.next_node = new_node
current_node.next_node return None
#i=1, index=1
#exit while at (index-1) 0 -> 'Hey'
# ['Hey', 'I', 'Just', 'Met']
# ll = reset_ll()
# print(read_all_ll_whileloop(ll))
# insert_ll_WHILELOOP(ll,0,Node("YOU"))
# print(read_all_ll_whileloop(ll))
= reset_ll()
ll 1,Node("YOU"))
insert_ll_WHILELOOP(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 2,Node("YOU"))
insert_ll_WHILELOOP(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 3,Node("YOU"))
insert_ll_WHILELOOP(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll 4,Node("YOU"))
insert_ll_WHILELOOP(ll,print(read_all_ll_whileloop(ll))
= reset_ll()
ll print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN")
5,Node("YOU")) # OUT OF INDEX ERROR EXPECTED
insert_ll_WHILELOOP(ll,print(read_all_ll_whileloop(ll))
['Hey', 'YOU', 'I', 'Just', 'Met']
['Hey', 'I', 'YOU', 'Just', 'Met']
['Hey', 'I', 'Just', 'YOU', 'Met']
['Hey', 'I', 'Just', 'Met', 'YOU']
OUT-OF-INDEX ERROR EXPECTED NEXT RUN
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[45], line 44 42 ll = reset_ll() 43 print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN") ---> 44 insert_ll_WHILELOOP(ll,5,Node("YOU")) # OUT OF INDEX ERROR EXPECTED 45 print(read_all_ll_whileloop(ll)) Cell In[45], line 14, in insert_ll_WHILELOOP(linked_list, index, new_node) 12 i+=1 13 # print(current_node.data) ---> 14 new_node.next_node = current_node.next_node 15 current_node.next_node = new_node 16 return None AttributeError: 'NoneType' object has no attribute 'next_node'
4. Delete
from LinkedList
4.1 Delete(0)
or Top
# [Hey', 'I', 'Just', 'Met']
# del 0 -> 'I', 'Just', 'Met'
def delete_top_ll(linked_list: LinkedList, index=0):
= linked_list.first_node
current_node if index==0:
=current_node.next_node
linked_list.first_node
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=0)
delete_top_ll(ll,indexprint(read_all_ll_whileloop(ll))
['Hey', 'I', 'Just', 'Met']
['I', 'Just', 'Met']
4.2 Delete(Index)
4.2.1 Delete(Index)
: for
-loop version
def delete_node_ll_FORLOOP(linked_list: LinkedList, index=0):
= linked_list.first_node
current_node if index==0:
=current_node.next_node
linked_list.first_node
for i in range(index):
if i==index-1:
= current_node.next_node
next_node = next_node.next_node
current_node.next_node =current_node.next_node
current_node
# ['Hey', 'I', 'Just', 'Met']
# ['Hey' , 'Just', 'Met']
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=0)
delete_node_ll_FORLOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=1)
delete_node_ll_FORLOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=2)
delete_node_ll_FORLOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=3)
delete_node_ll_FORLOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN")
=4) # OUT OF INDEX ERROR EXPECTED
delete_node_ll_FORLOOP(ll,indexprint(read_all_ll_whileloop(ll))
['Hey', 'I', 'Just', 'Met']
['I', 'Just', 'Met']
['Hey', 'I', 'Just', 'Met']
['Hey', 'Just', 'Met']
['Hey', 'I', 'Just', 'Met']
['Hey', 'I', 'Met']
['Hey', 'I', 'Just', 'Met']
['Hey', 'I', 'Just']
['Hey', 'I', 'Just', 'Met']
OUT-OF-INDEX ERROR EXPECTED NEXT RUN
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[46], line 42 40 print(read_all_ll_whileloop(ll)) 41 print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN") ---> 42 delete_node_ll_FORLOOP(ll,index=4) # OUT OF INDEX ERROR EXPECTED 43 print(read_all_ll_whileloop(ll)) Cell In[46], line 9, in delete_node_ll_FORLOOP(linked_list, index) 7 if i==index-1: 8 next_node = current_node.next_node ----> 9 current_node.next_node = next_node.next_node 10 current_node=current_node.next_node AttributeError: 'NoneType' object has no attribute 'next_node'
4.2.2 Delete(Index)
: while
-loop version
def delete_node_ll_WHILELOOP(linked_list: LinkedList, index=0):
= linked_list.first_node
current_node if index==0:
=current_node.next_node
linked_list.first_node=0
iwhile current_node: # for i in range(index):
if i==index-1:
# next_node = current_node.next_node.next_node
# current_node.next_node = next_node.next_node
= current_node.next_node.next_node
current_node.next_node # current_node.next_node = next_node.next_node
=current_node.next_node
current_node+=1
i= reset_ll()
ll print(read_all_ll_whileloop(ll))
=0)
delete_node_ll_WHILELOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=1)
delete_node_ll_WHILELOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=2)
delete_node_ll_WHILELOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
=3)
delete_node_ll_WHILELOOP(ll,indexprint(read_all_ll_whileloop(ll))
print()
= reset_ll()
ll print(read_all_ll_whileloop(ll))
print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN")
=4) # OUT OF INDEX ERROR EXPECTED
delete_node_ll_WHILELOOP(ll,indexprint(read_all_ll_whileloop(ll))
['Hey', 'I', 'Just', 'Met']
['I', 'Just', 'Met']
['Hey', 'I', 'Just', 'Met']
['Hey', 'Just', 'Met']
['Hey', 'I', 'Just', 'Met']
['Hey', 'I', 'Met']
['Hey', 'I', 'Just', 'Met']
['Hey', 'I', 'Just']
['Hey', 'I', 'Just', 'Met']
OUT-OF-INDEX ERROR EXPECTED NEXT RUN
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[47], line 41 39 print(read_all_ll_whileloop(ll)) 40 print("OUT-OF-INDEX ERROR EXPECTED NEXT RUN") ---> 41 delete_node_ll_WHILELOOP(ll,index=4) # OUT OF INDEX ERROR EXPECTED 42 print(read_all_ll_whileloop(ll)) Cell In[47], line 10, in delete_node_ll_WHILELOOP(linked_list, index) 6 while current_node: # for i in range(index): 7 if i==index-1: 8 # next_node = current_node.next_node.next_node 9 # current_node.next_node = next_node.next_node ---> 10 current_node.next_node = current_node.next_node.next_node 11 # current_node.next_node = next_node.next_node 12 current_node=current_node.next_node AttributeError: 'NoneType' object has no attribute 'next_node'