Extended Dsa Problems
Extended Dsa Problems
class LinkedList:
def __init__(self):
self.head = None
def sort(self):
if not self.head or not self.head.next:
return # No need to sort if the list has 0 or 1 element
def __str__(self):
current = self.head
result = []
while current:
result.append(str(current.data))
current = current.next
return " -> ".join(result) + " -> None"
# Example usage:
ll = LinkedList()
ll.append(30)
ll.append(10)
ll.append(20)
print("Before sorting:")
print(ll)
ll.sort()
print("After sorting:")
print(ll)
Inserting a Node in Sorted Linked List:
class Node:
def __init__(self,data=None):
self.data=data
self.next=None
class LinkedList:
def __init__(self):
self.head=None
def insert(self,data):
new_node=Node(data)
if self.head is None:
self.head=new_node
else:
cur=self.head
while cur.next!=None:
cur=cur.next
new_node.next=cur.next
cur.next=new_node
def insertion_in_sorted_list(self,data):
new_node=Node(data)
if self.head is None:
new_node.next=self.head
self.head=new_node
elif self.head.data>=new_node.data:
new_node.next=self.head
self.head=new_node
else:
cur=self.head
while cur.next is not None and cur.next.data<new_node.data:
cur=cur.next
new_node.next=cur.next
cur.next=new_node
return self.head
def display(self):
cur=self.head
while cur!=None:
print(cur.data,end="->")
cur=cur.next
print(None)
ll=LinkedList()
ll.insert(1)
ll.display()
ll.insert(2)
ll.insert(4)
ll.display()
ll.insertion_in_sorted_list(3)
ll.display()
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def display(self):
cur = self.head
while cur != None:
print(cur.data, end="->")
cur = cur.next
print(None)
# Example usage
ll = LinkedList()
ll.insert(0)
ll.insert(1)
ll.insert(2)
ll.insert(3)
ll.insert(4)
ll.insert(5)
ll.insert(6)
ll.insert(7)
ll.insert(8)
ll.display()
# Reverse in groups of 3
ll.head = ll.reverse(ll.head, 3)
ll.display()
ll=LinkedList()
ll.insert(5)
ll.insert(9)
ll.insert(4)
ll.insert(2)
ll.insert(11)
ll.display()
ll.sort(ll.head)
ll.display()
Find the middle of a Linked List(Floyds cycle detection algorithm)
class LinkedList:
def __init__(self):
self.head = None
return result
middle = self.get_middle(head)
next_to_middle = middle.next
middle.next = None # Split the linked list into two halves
left = self.merge_sort(head)
right = self.merge_sort(next_to_middle)
def sort(self):
self.head = self.merge_sort(self.head)
def display(self):
cur = self.head
while cur:
print(cur.data, end=" -> ")
cur = cur.next
print("None")
# Example usage
ll = LinkedList()
ll.insert(4)
ll.insert(2)
ll.insert(1)
ll.insert(3)
ll.insert(5)
print("Original List:")
ll.display()
ll.sort()
print("Sorted List:")
ll.display()
# Opening bracket
if char in '({[':
stack.append(char)
# Closing Bracket
elif char in ')}]':
if ispar(s):
print("true")
else:
print("false")
s=input("enter a string")
reverse(s)
Postfix to prefix:
def postfix_to_prefix(postfix):
stack = []
# Example usage
postfix_expr = "AB+CD-*"
prefix_expr = postfix_to_prefix(postfix_expr)
print("Postfix Expression:", postfix_expr)
print("Prefix Expression:", prefix_expr)
Convert Infix expression to Postfix expression
# Function to return precedence of operators
def prec(c):
if c == '^':
return 3
elif c == '/' or c == '*':
return 2
elif c == '+' or c == '-':
return 1
else:
return -1
for i in range(len(s)):
c = s[i]
# If an operator is scanned
else:
while st and (prec(c) < prec(st[-1]) or prec(c) == prec(st[-1])):
result += st.pop()
st.append(c)
print(result)
exp = "a+b*(c^d-e)^(f+g*h)-i"
infixToPostfix(exp)