#Linked list 

class Node:
	def __init__(self,d,n = None):
		self.data = d
		self.next_node = n

	def get_next(self):
		return self.next_node

	def set_next(self,n):
		self.next_node = n 

	def get_data(self):
		return self.data

	def set_data(self,d):
		self.data = d

class LinkedList:
	def __init__(self,r=None):
		self.root = r 
		self.size = 0 

	def get_size(self): #o(n) we have to go through whole list and count to get size 
		return self.size

	def add (self,d): #O(1)
		new_node = Node(d,self.root)
		self.root = new_node
		self.size += 1 

	def remove(self,d): #O(n)
		this_node = self.root
		prev_node = None
		while this_node:
			if this_node.get_data(d):
				if prev_node:
					prev_node.set_next(this_node.get_next())
				else:
					self.root = this_node
				self.size -= 1 
				return True
			else:
				prev_node = this_node
				this_node = this_node.get_next()
		return False
		

	def find(self,d): #O(n)
		this_node = self.root
		while this_node:
			if this_node.get_data() == d:
				return d
			else:
				this_node = this_node.get_next()
		return None


myList = LinkedList()
myList.add(5)
myList.add(3)
myList.add(10)
myList.remove(5)
print(myList.find(3))

