0% found this document useful (0 votes)
6 views

Linkedlist-implementations

Uploaded by

Nitheesh Bobby
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views

Linkedlist-implementations

Uploaded by

Nitheesh Bobby
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 28

***LinkedList***

class Node:
def __init__(self,data=None):
self.data=data
self.next=None
class Linkedlist:
def __init__(self):
self.head=None

def insert_at_beginning(self,data):
new_node=Node(data)
if self.head==None:
self.head=new_node
print("node is inserted at begining if no node is present initially")
else:
new_node.next=self.head
self.head=new_node
print("node is inserted at the begining if already an initial node exists")

def insertion_at_end(self,data):
new_node=Node(data)
cur=self.head
while cur.next!=None:
cur=cur.next
cur.next=new_node
def insert_after_node(self,key,value):
cur=self.head
while cur!=None:
if(cur.data==key):
break
cur=cur.next
if cur is None:
return self.head
new_node=Node(value)
new_node.next=cur.next
cur.next=new_node
return self.head

def insertion_at_position(self,pos,value,size):
if pos<1 or pos>size+1:
print("insertion is not possible")
return self.head
else:
new_node=Node(value)
if pos==1:
self.head.next=new_node.next
self.head=new_node
else:
cur=self.head
for _ in range(1,pos-1):
cur=cur.next
new_node.next=cur.next
cur.next=new_node
size+=1
return self.head
def insert_at_end(self,data):
new_node=Node(data)
cur=self.head
while cur!=None:
cur=cur.next
cur.next=new_node

def find_length(self):
count=0
cur=self.head
while cur!=None:
cur=cur.next
count+=1
print(count)

def search(self,key):
cur=self.head
while cur!=None:
if cur.data==key:
return True
cur=cur.next
return False

def del_at_first(self):
if self.head is None:
return None
self.head=self.head.next
def del_at_specific(self,position):
temp=self.head
prev=None
if temp is None:
return self.head
if position==1:
self.head=temp.next
return self.head
for i in range(1,position):
prev=temp
temp=temp.next
if temp is None:
return self.head
if temp is not None:
prev.next=temp.next
return self.head

def del_at_end(self):
if not self.head:
return None
if not self.head.next:
return None
second_last=self.head
while second_last.next.next:
second_last=second_last.next
second_last.next=None
return self.head
def reverse(self):
cur=self.head
prev=None
while cur!=None:
next_node=cur.next
cur.next=prev
prev=cur
cur=next_node
self.head=prev

def display(self):
elems=[]
cur_node=self.head
while cur_node!=None:
elems.append(cur_node.data)
cur_node=cur_node.next
print(elems)

l=Linkedlist()
l.insert_at_beginning(2)
l.insert_at_beginning(1)
l.insertion_at_end(4)
l.insert_after_node(2,3)
l.insertion_at_position(3,5,4)
l.insertion_at_end(6)
l.display()
l.find_length()
print(l.search(5))
new_head=l.del_at_first()
print(new_head)
l.display()
l.del_at_specific(3)
l.display()
l.del_at_end()
l.display()
l.reverse()
l.display()

Output:
node is inserted at begining if no node is present initially
node is inserted at the begining if already an initial node exists
[1, 2, 5, 3, 4, 6]
6
True
None
[2, 5, 3, 4, 6]
[2, 5, 4, 6]
[2, 5, 4]
[4, 5, 2]
** Process exited - Return Code: 0 **
Press Enter to exit terminal

DoubleLinkedlist:
class Node:
def __init__(self,data):
self.data=data
self.prev=None
self.next=None
class DoubleLinked:
def __init__(self):
self.head=None

def insert_at_beginning(self,data):
new_node=Node(data)
new_node.next=self.head
if self.head is not None:
self.head.prev=new_node
self.head=new_node
return self.head

def insert_at_end(self,data):
new_node=Node(data)
if self.head is None:
self.head=new_node
else:
cur=self.head
while cur.next is not None:
cur=cur.next
cur.next=new_node
new_node.prev=cur
return self.head
def insert_at_pos(self,pos,data):
new_node=Node(data)
count=0
cur=self.head
while cur.next!=None:
if(count==pos):
new_node.prev=cur
new_node.next=cur.next
cur.next.prev=new_node
cur.next=new_node
return head
count=count+1
cur=cur.next
if cur.next==None and count==pos:
cur.next=new_node
new_node.prev=cur
return self.head

def display(self):#forward_traversal
elems=[]
cur=self.head
while cur!=None:
elems.append(cur.data)
cur=cur.next
return elems

def backward(self):
elems=[]
cur=self.head
while cur!=None and cur.next!=None:
cur=cur.next
while cur!=None:
elems.append(cur.data)
cur=cur.prev
return elems

def length(self):
count=0
cur=self.head
while cur!=None:
count+=1
cur=cur.next
return count

def del_beginning(self):
if not self.head:
return
self.head=self.head.next
if self.head is not None:
self.head.prev=None
return self.head

def del_at_end(self):
if not self.head:
return
if self.head is None:
return None
cur=self.head
while cur.next!=None:
cur=cur.next
cur.prev.next=None
return self.head

def del_at_specific(self,pos):
if not self.head:
return
cur=self.head

for i in range(1,pos):
if cur==None:
break
cur=cur.next

if cur is None:
return self.head

if cur.prev is not None:


cur.prev.next=cur.next

if cur.next is not None:


cur.next.prev=cur.prev
if self.head == cur:
self.head=cur.next

cur=None
return self.head

def search_ele(self,val):
cur=self.head
while cur!=None:
if cur.data==val:
return True
cur=cur.next
return False

dl=DoubleLinked()
dl.insert_at_beginning(1)
print(dl.display())
dl.insert_at_end(2)
dl.insert_at_end(3)
dl.insert_at_end(4)
dl.insert_at_end(5)
print(dl.display())
dl.insert_at_pos(4,6)
print(dl.display())
print(dl.backward())
print(dl.length())
dl.del_beginning()
print(dl.display())
dl.del_at_end()
print(dl.display())
dl.del_at_specific(2)
print(dl.display())
print(dl.search_ele(6))

[1]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[6, 5, 4, 3, 2, 1]
6
[2, 3, 4, 5, 6]
[2, 3, 4, 5]
[2, 4, 5]
False
** Process exited - Return Code: 0 **
Press Enter to exit terminal

***Stack***
class Stack:

def __init__(self):
self.stack=[]

def is_empty(self):
return len(self.stack)==0
def push(self,data):
self.stack.append(data)

def pop(self):
if self.is_empty():
raise IndexError("stack is empty we cannot pop")
return self.stack.pop()

def peek(self):
if self.is_empty():
raise IndexError("stack is empty")
return self.stack[-1]

def size(self):
return len(self.stack)

def __str__(self):
return str(self.stack)

# Example usage
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print("Stack:", stack)
print("Pop:", stack.pop())
print("Peek:", stack.peek())
print("Size:", stack.size())
print("Is empty:", stack.is_empty())

***stack implementation using linkedlist**

#implementing stack using linkedlist:

class Node:

def __init__(self,data):
self.data=data
self.next=None

class Stack:

def __init__(self):
self.head=None

def is_empty(self):
return self.head is None

def push(self,data):
new_node=Node(data)

if not new_node:
print("\n stack overflow")
return
new_node.next=self.head
self.head=new_node

def pop(self):

if self.is_empty():
print("\n stack underflow")
else:
temp=self.head
self.head=self.head.next
del temp

def peek(self):

if not self.is_empty():
return self.head.data

else:
print("\n stack is empty")
return float('-inf')

st=Stack()
st.push(1)
st.push(2)
st.push(3)
st.push(4)

print("top element is",st.peek())


st.pop()
print("top element is",st.peek())

**Queue data structure**:

class Queue:

def __init__(self):
self.queue=[]

def is_empty(self):
return len(self.queue)==0

def enqueue(self,data):
self.queue.append(data)

def dequeue(self):

if self.is_empty():
raise IndexError("queue is empty")

return self.queue.pop(0)

def length(self):
return len(self.queue)

def peek(self):
if self.is_empty():
raise IndexError("Queue is empty")
return self.queue[0]

def __str__(self):
return str(self.queue)

qe=Queue()
qe.enqueue(1)
qe.enqueue(2)
qe.enqueue(3)
qe.enqueue(4)
qe.enqueue(5)

print("queue :", qe)

print("Dequeue : ",qe.dequeue())

print("length : ", qe.length())

print("peek : ", qe.peek())

print("queue :", qe)

***Queue using Linkedlist***

class Node:
def __init__(self,data):
self.data=data
self.next=None
class Queue:

def __init__(self):
self.front=None
self.rear=None

def is_empty(self):
return self.front is None and self.rear is None

def enqueue(self,data):
new_node=Node(data)
if self.rear is None:
self.rear=self.front=new_node
return

self.rear.next=new_node
self.rear=new_node

def dequeue(self):
if self.is_empty():
print("\n Queue is empty")
return
temp=self.front
self.front=self.front.next
if self.front is None:
self.rear=None

def get_front(self):
if self.is_empty():
print("\n Queue is empty")
return float('-inf')
return self.front.data

def get_rear(self):
if self.is_empty():
print("\n queue is empty")
return float('-inf')
return self.rear.data

q = Queue()

# Enqueue elements into the queue


q.enqueue(10)
q.enqueue(20)

# Display the front and rear elements of the queue


print("Queue Front:", q.get_front())
print("Queue Rear:", q.get_rear())

# Dequeue elements from the queue


q.dequeue()
q.dequeue()
# Enqueue more elements into the queue
q.enqueue(30)
q.enqueue(40)
q.enqueue(50)

# Dequeue an element from the queue


q.dequeue()

# Display the front and rear elements of the queue


print("Queue Front:", q.get_front())
print("Queue Rear:", q.get_rear())

**Tree Implementation**
# Tree traversal in Python

class Node:
def __init__(self, item):
self.left = None
self.right = None
self.val = item

def inorder(root):

if root:
# Traverse left
inorder(root.left)
# Traverse root
print(str(root.val) + "->", end='')
# Traverse right
inorder(root.right)

def postorder(root):

if root:
# Traverse left
postorder(root.left)
# Traverse right
postorder(root.right)
# Traverse root
print(str(root.val) + "->", end='')

def preorder(root):

if root:
# Traverse root
print(str(root.val) + "->", end='')
# Traverse left
preorder(root.left)
# Traverse right
preorder(root.right)
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)

print("Inorder traversal ")


inorder(root)

print("\nPreorder traversal ")


preorder(root)

print("\nPostorder traversal ")


postorder(root)

**Binary Search Tree Implementation**

class TreeNode:
def __init__(self,data):
self.data=data
self.left=None
self.right=None
class BinarySearchTree:
def __init__(self):
self.root=None
def insert(self,data):
if self.root is None:
self.root=TreeNode(data)
return
self._insert(self.root,data)

def _insert(self,node,data):
if data < node.data:
if node.left is None:
node.left=TreeNode(data)
else:
self._insert(node.left,data)
else:
if node.right is None:
node.right=TreeNode(data)
else:
self._insert(node.right,data)

def inorder(self):
nodes=[]
self._inorder(self.root,nodes)
return nodes

def _inorder(self,node,nodes):
if node is not None:
self._inorder(node.left,nodes)
nodes.append(node.data)
self._inorder(node.right,nodes)
def preorder(self):
nodes=[]
self._preorder(self.root,nodes)
return nodes

def _preorder(self,node,nodes):
if node is not None:
nodes.append(node.data)
self._preorder(node.left,nodes)
self._preorder(node.right,nodes)

def postorder(self):
nodes=[]
self._postorder(self.root,nodes)
return nodes

def _postorder(self,node,nodes):
if node is not None:
self._postorder(node.left,nodes)
self._postorder(node.right,nodes)
nodes.append(node.data)

def find(self,data):
return self._find(self.root,data)

def _find(self,node,data):
if node is None:
return False
if data==node.data:
return True
elif data<node.data:
return self._find(node.left,data)
else:
return self._find(node.right,data)

bst=BinarySearchTree()
bst = BinarySearchTree()
bst.insert(10)
bst.insert(5)
bst.insert(20)
bst.insert(3)
bst.insert(7)
bst.insert(15)
bst.insert(30)
print("Inorder traversal:", bst.inorder())
print("Preorder Traversal:",bst.preorder())
print("Postorder Traversal:",bst.postorder())
print("Element is present:",bst.find(15))
*** DFS Tree Traversal***
# Python3 program to for tree traversals

# A class that represents an individual node in a


# Binary Tree

class Node:
def __init__(self, key):
self.left = None
self.right = None
self.val = key

# A function to do inorder tree traversal


def printInorder(root):

if root:

# First recur on left child


printInorder(root.left)

# then print the data of node


print(root.val),

# now recur on right child


printInorder(root.right)

# A function to do postorder tree traversal


def printPostorder(root):

if root:

# First recur on left child


printPostorder(root.left)

# the recur on right child


printPostorder(root.right)

# now print the data of node


print(root.val),

# A function to do preorder tree traversal


def printPreorder(root):

if root:

# First print the data of node


print(root.val),

# Then recur on left child


printPreorder(root.left)
# Finally recur on right child
printPreorder(root.right)

# Driver code
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
print "Preorder traversal of binary tree is"
printPreorder(root)

print "\nInorder traversal of binary tree is"


printInorder(root)

print "\nPostorder traversal of binary tree is"


printPostorder(root)

You might also like