Can I make the logic for indexing elements more efficient?
class ListNode:
def __init__(self, data):
self.data = data
self.prev = self.next = None
class DoublyLinkedList:
def __init__(self):
self.head = self.tail = None
self.size = 0
def __len__(self):
return self.size
def __getitem__(self, index):
if index < 0:
index += len(self)
current = self.head
for _ in range(index):
current = current.next
return current.data
def append(self, data):
new_node = ListNode(data)
if not self.head:
self.head = self.tail = new_node
else:
new_node.prev = self.tail
self.tail.next = self.tail = new_node
self.size += 1
def appendleft(self, data):
new_node = ListNode(data)
if not self.head:
self.head = self.tail = new_node
else:
new_node.next = self.head
self.head.prev = self.head = new_node
self.size += 1
def insert(self, index, data):
if index < 0:
index += len(self)
if index == 0:
self.appendleft(data)
elif index == len(self):
self.append(data)
else:
current = self.head
for _ in range(index):
current = current.next
new_node = ListNode(data)
new_node.prev, new_node.next = current.prev, current
if current.prev:
current.prev.next = new_node
current.prev = new_node
self.size += 1
def pop(self):
if self.tail:
data = self.tail.data
if self.head == self.tail:
self.head = self.tail = None
else:
self.tail, self.tail.next = self.tail.prev, None
self.size -= 1
return data```