"""
linked list
"""
#creating a class of node and creating contents
class Node:
def __init__(self, contents, next_node=None):
self.contents = contents
self.next = next_node
def __repr__(self):
return f"This node contains {str(self.contents)}."
# creating the linked list class
class LinkedList:
#creates data as an empty array
def __init__(self, data=[]):
self.head = None
if data:
self._init_from_data(data)
#creating data for the linked list
def _init_from_data(self, data):
previous_node = None
for datum in data:
new_node = Node(datum)
if not self.head:
self.head = new_node
else:
previous_node.next = new_node
previous_node = new_node
#
def _get_tail(self):
current_node = self.head
while current_node and current_node.next:
current_node = current_node.next
return current_node
def append_left(self, datum):
new_node = Node(datum, self.head)
self.head = new_node
def append_right(self, datum):
if self.head:
tail_node = self._get_tail()
tail_node.next = Node(datum)
else:
self.head = Node(datum)
def pop_left(self):
old_head = self.head
new_head = old_head.next
self.head = new_head
return old_head
def pop_right(self):
previous_node = None
current_node = self.head
while current_node and current_node.next:
previous_node = current_node
current_node = current_node.next
if previous_node:
previous_node.next = None
else:
self.head = None
return current_node
def __repr__(self):
current_node = self.head
nodes_contents = []
while current_node:
nodes_contents.append(current_node.contents)
current_node = current_node.next
nodes_contents.append("None")
return " >>> ".join(nodes_contents)
def reverse(self):
if(self.head == None):
return
else:
node = self.head
previous_node = None
# Step 1 : Reverse Links;
while(node != None):
temp = node.next
node.next = previous_node
previous_node = node
node = temp
# Step 2 : Change Head;
if(temp == None):
self.head = previous_node
return self.head
empty_list = LinkedList()
linked_list = LinkedList(["a","b","c"])
linked_list.append_left('aa')
linked_list.append_right('cc')
print(linked_list)
linked_list.pop_right()
print(linked_list)
linked_list.pop_left()
print(linked_list)
linked_list.reverse()
print(linked_list)