Skip to content

Instantly share code, notes, and snippets.

@nitori
Created February 10, 2025 21:15
Show Gist options
  • Save nitori/34b373a9730168ecde29e4f546757f25 to your computer and use it in GitHub Desktop.
Save nitori/34b373a9730168ecde29e4f546757f25 to your computer and use it in GitHub Desktop.
Simple double linked list with constant time list reversal.
class List:
_head: 'Node|None'
_tail: 'Node|None'
def __init__(self):
self.reversed = False
self._head = None
self._tail = None
def append(self, value):
node = Node(self, value)
if not self._head:
# assume self._tail is None too
self._head = node
self._tail = node
return
self._tail.next = node
node.prev = self._tail
self._tail = node
def appendleft(self, value):
node = Node(self, value)
if not self._head:
# assume self._tail is None too
self._head = node
self._tail = node
return
self._head.prev = node
node.next = self._head
self._head = node
def reverse(self): # O(1)
self._head, self._tail = self._tail, self._head
self.reversed = not self.reversed
def __repr__(self):
current = self._head
vals = []
while current:
vals.append(current.value)
current = current.next
sval = str(vals)[1:-1]
return f'List({sval})'
class Node:
_list: List
def __init__(self, _list, value):
self.value = value
self._list = _list
self.left = None
self.right = None
@property
def next(self):
if self._list.reversed:
return self.left
return self.right
@next.setter
def next(self, value):
if self._list.reversed:
self.left = value
else:
self.right = value
@property
def prev(self):
if self._list.reversed:
return self.right
return self.left
@prev.setter
def prev(self, value):
if self._list.reversed:
self.right = value
else:
self.left = value
def main():
lst = List()
lst.append(1)
lst.append(2)
lst.append(3)
lst.appendleft(4)
lst.appendleft(5)
lst.append(6)
lst.append(7)
print(lst)
lst.reverse()
print(lst)
lst.append(10)
print(lst)
lst.reverse()
print(lst)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment