1.1 Linked List

class LinkedList():
    class Node():
        def __init__(self, value):
            self.left = None
            self.right = None
            self.value = value

    def __init__(self):
        self.start = self.Node(None)
        self.last = self.start
        self.length = 0
        
    def append(self, value):
        self.last.right = self.Node(value)
        self.last, self.last.left = self.last.right, self.last
        self.length+=1

    def pop(self, index:int=None):
        if index is None:
            index = self.length-1
        if index >= self.length:
            return None
        curr = self.start
        for _ in range(index+1):
            curr = curr.right
        if index == self.length-1:
            curr.left.right = None
            self.last = curr.left
        else:
            curr.left.right, curr.right.left = curr.right, curr.left
            self.last = curr.right
        self.length-=1
        return curr.value

    def __str__(self):
        seq = "["
        curr = self.start
        while curr.right:
            seq += curr.right.value
            curr = curr.right
            if curr.right:
                seq+=", "
        seq+="]"
        return seq

1.1.1 Queue

class Queue(LinkedList):
    def __init__(self):
        super().__init__()

    def pop(self, index:int=None):
        index = 0 if index is None else index
        if index >= self.length:
            return None
        curr = self.start
        for _ in range(index+1):
            curr = curr.right
        if index == self.length-1:
            curr.left.right = None
            self.last = curr.left
        else:
            curr.left.right, curr.right.left = curr.right, curr.left
            self.last = curr.right
        self.length-=1
        return curr.value

1.1.2 Dequeue

class Dequeue(LinkedList):

    def __init__(self):
        super().__init__()

    def appendleft(self, value):
        self.start.left = self.Node(value)
        self.start, self.start.right = self.start.left, self.start
        self.length+=1
    
    def popleft(self):
        curr = self.start
        curr.left.right, curr.right.left = curr.right, curr.left
        self.last = curr.right
        self.length-=1
        return curr.value

1.1.3 Circular Queue