Added linked and doublely-linked list Python code
This commit is contained in:
parent
5a96497b69
commit
3ae086fb58
127
linked_list.py
127
linked_list.py
@ -1,15 +1,99 @@
|
|||||||
class Node:
|
class Node:
|
||||||
def __init__(self, data):
|
def __init__(self, index, x:int, y:int):
|
||||||
self.data = data
|
self.index = index
|
||||||
|
self.data = (x, y)
|
||||||
self.prev = None
|
self.prev = None
|
||||||
self.next = None
|
self.next = None
|
||||||
|
|
||||||
|
class LinkedList:
|
||||||
|
def __init__(self, x:int, y: int):
|
||||||
|
self.data = (x, y)
|
||||||
|
self.head = None
|
||||||
|
|
||||||
|
def append(self, x:int, y:int):
|
||||||
|
new_node = Node(None, x, y)
|
||||||
|
if not self.head:
|
||||||
|
self.head = new_node
|
||||||
|
return
|
||||||
|
current = self.head
|
||||||
|
while current.next:
|
||||||
|
current = current.next
|
||||||
|
current.next = new_node
|
||||||
|
|
||||||
|
def insert(self, index, x: int, y:int):
|
||||||
|
new_node = Node(index, x, y)
|
||||||
|
if not self.head or index == 0:
|
||||||
|
new_node.next = self.head
|
||||||
|
if self.head:
|
||||||
|
self.head.prev = new_node
|
||||||
|
self.head = new_node
|
||||||
|
return
|
||||||
|
current = self.head
|
||||||
|
prev = None
|
||||||
|
curr_index = 0
|
||||||
|
while current and curr_index < index:
|
||||||
|
prev = current
|
||||||
|
current = current.next
|
||||||
|
curr_index += 1
|
||||||
|
new_node.next = current
|
||||||
|
if current:
|
||||||
|
current.prev = new_node
|
||||||
|
prev.next = new_node
|
||||||
|
new_node.prev = prev
|
||||||
|
|
||||||
|
|
||||||
|
def delete(self, index: int):
|
||||||
|
if not self.head:
|
||||||
|
print("List is empty.")
|
||||||
|
return
|
||||||
|
|
||||||
|
current = self.head
|
||||||
|
curr_index = 0
|
||||||
|
|
||||||
|
# Deleting the head node
|
||||||
|
if index == 0:
|
||||||
|
self.head = current.next
|
||||||
|
if self.head:
|
||||||
|
self.head.prev = None
|
||||||
|
return
|
||||||
|
|
||||||
|
# Traverse to the node at the given index
|
||||||
|
while current and curr_index < index:
|
||||||
|
current = current.next
|
||||||
|
curr_index += 1
|
||||||
|
|
||||||
|
if not current:
|
||||||
|
print("Index out of bounds.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Re-link the previous and next nodes
|
||||||
|
if current.prev:
|
||||||
|
current.prev.next = current.next
|
||||||
|
if current.next:
|
||||||
|
current.next.prev = current.prev
|
||||||
|
|
||||||
|
def to_list(self):
|
||||||
|
result = []
|
||||||
|
current = self.head
|
||||||
|
while current:
|
||||||
|
result.append(current.data)
|
||||||
|
current = current.next
|
||||||
|
return result
|
||||||
|
|
||||||
|
def display_forward(self):
|
||||||
|
current = self.head
|
||||||
|
while current:
|
||||||
|
print(current.data, end=" -> ")
|
||||||
|
current = current.next
|
||||||
|
print("None")
|
||||||
|
|
||||||
|
|
||||||
class DoublyLinkedList:
|
class DoublyLinkedList:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.head = None
|
self.head = None
|
||||||
|
|
||||||
def append(self, data):
|
def append(self, x, y):
|
||||||
new_node = Node(data)
|
new_node = Node(None, x, y)
|
||||||
if not self.head:
|
if not self.head:
|
||||||
self.head = new_node
|
self.head = new_node
|
||||||
return
|
return
|
||||||
@ -19,8 +103,8 @@ class DoublyLinkedList:
|
|||||||
current.next = new_node
|
current.next = new_node
|
||||||
new_node.prev = current
|
new_node.prev = current
|
||||||
|
|
||||||
def insert(self, index, data):
|
def insert(self, index, x, y):
|
||||||
new_node = Node(data)
|
new_node = Node(None, x, y)
|
||||||
if index == 0:
|
if index == 0:
|
||||||
new_node.next = self.head
|
new_node.next = self.head
|
||||||
if self.head:
|
if self.head:
|
||||||
@ -40,10 +124,10 @@ class DoublyLinkedList:
|
|||||||
current.next.prev = new_node
|
current.next.prev = new_node
|
||||||
current.next = new_node
|
current.next = new_node
|
||||||
|
|
||||||
def delete(self, data):
|
def delete(self, x, y):
|
||||||
current = self.head
|
current = self.head
|
||||||
while current:
|
while current:
|
||||||
if current.data == data:
|
if current.data == (x, y):
|
||||||
if current.prev:
|
if current.prev:
|
||||||
current.prev.next = current.next
|
current.prev.next = current.next
|
||||||
else:
|
else:
|
||||||
@ -52,7 +136,7 @@ class DoublyLinkedList:
|
|||||||
current.next.prev = current.prev
|
current.next.prev = current.prev
|
||||||
return
|
return
|
||||||
current = current.next
|
current = current.next
|
||||||
raise ValueError(f"{data} not found in list")
|
raise ValueError(f"{(x, y)} not found in list")
|
||||||
|
|
||||||
def reverse(self):
|
def reverse(self):
|
||||||
current = self.head
|
current = self.head
|
||||||
@ -102,15 +186,28 @@ class DoublyLinkedList:
|
|||||||
current = current.prev
|
current = current.prev
|
||||||
print("None")
|
print("None")
|
||||||
|
|
||||||
|
|
||||||
|
ll = LinkedList(0, 0)
|
||||||
|
ll.append(0, 10)
|
||||||
|
ll.append(10, 20)
|
||||||
|
ll.append(20, 30)
|
||||||
|
ll.append(30, 40)
|
||||||
|
ll.insert(1, 11, 15)
|
||||||
|
ll.insert(2, 16, 20)
|
||||||
|
ll.delete(1)
|
||||||
|
ll.display_forward()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dll = DoublyLinkedList()
|
dll = DoublyLinkedList()
|
||||||
dll.append(10)
|
dll.append(10, 6)
|
||||||
dll.append(20)
|
dll.append(20, 5)
|
||||||
dll.append(30)
|
dll.append(30, 3)
|
||||||
dll.insert(1, 15) # Insert 15 at index 1
|
dll.insert(1, 15, 10) # Insert 15 at index 1
|
||||||
dll.delete(20) # Remove node with value 20
|
dll.delete(20, 5) # Remove node with value 20
|
||||||
dll.reverse() # Reverse the list
|
dll.reverse() # Reverse the list
|
||||||
print("Index of 15:", dll.find(15))
|
print("Index of 15:", dll.find(15))
|
||||||
dll.append(50)
|
dll.append(50, 8)
|
||||||
print(dll.to_list()) # Output: [30, 15, 10, 50]
|
print(dll.to_list()) # Output: [30, 15, 10, 50]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user