Skip to content

Instantly share code, notes, and snippets.

@Drarig29
Last active October 13, 2019 15:26
Show Gist options
  • Save Drarig29/35cccf24e66895120e7661d89db7608b to your computer and use it in GitHub Desktop.
Save Drarig29/35cccf24e66895120e7661d89db7608b to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# coding: utf-8
class Node:
def __init__(self, value, previous, next_):
self.value = value
self.previous = previous
self.next = next_
def __repr__(self):
return str(self.value)
class ChainedList:
def __init__(self, *args):
self._first = None
self._len = 0
self._generate_list(args)
def _generate_list(self, elements):
self._len = len(elements)
if len(elements) == 0:
return
elif len(elements) >= 1:
self._first = Node(elements[0], None, None)
e = self._first
for i in range(1, len(elements)):
e.next = Node(elements[i], e, None)
e = e.next
e.next = self._first
self._first.previous = e
def append(self, element):
if self._first != None:
last = self._first.previous
new = Node(element, last, self._first)
last.next = new
self._first.previous = new
self._len += 1
else:
self._generate_list([element])
def insert(self, index, element):
if self._first is None:
self._generate_list([element])
else:
if index == 0:
new = Node(element, self._first.previous, self._first)
self._first = new
self._first.next.previous = self._first
self._first.previous.next = self._first
else:
i = 0
e = self._first
while i != index:
if e.next is not None:
e = e.next
i += 1
else:
break
temp = Node(element, e.previous, e)
e.previous = temp
temp.previous.next = temp
temp.next.previous = temp
self._len += 1
def __repr__(self):
buffer = f"[{self._first}"
e = self._first.next
while e != self._first:
buffer += f", {e}"
e = e.next
buffer += "]"
return buffer
def __len__(self):
return self._len
def __add__(self, other):
if not isinstance(other, ChainedList):
raise TypeError
new = ChainedList()
for element in self.iter():
new.append(element)
for element in other.iter():
new.append(element)
return new
def __getitem__(self, index):
if not isinstance(index, int):
raise TypeError
if self._first is None:
raise IndexError
if index < 0 or index >= len(self):
raise IndexError
if index == 0:
return self._first.value
i = 1
e = self._first.next
while i != index:
e = e.next
i += 1
return e.value
def __contains__(self, item):
if self._first is None:
return False
if self._first.value == item:
return True
e = self._first.next
while e != self._first:
if e.value == item:
return True
e = e.next
return False
def iter(self):
if self._first is not None:
yield self._first
e = self._first.next
while e != self._first:
yield e
e = e.next
def reverse_iter(self):
if self._first is not None:
yield self._first.previous
e = self._first.previous.previous
while e != self._first.previous:
yield e
e = e.previous
if __name__ == '__main__':
c = ChainedList(1, 2, 3, 4)
print(c)
c.append(5)
print(c)
print(len(c))
c.insert(0, 10)
print(c)
print(len(c))
for e in c.iter():
print(e, end=", ")
print()
for e in c.reverse_iter():
print(e, end=", ")
print()
a = c + c
print(c, a)
print("10 in c", 10 in c)
print(len(a))
for i in range(len(c)):
print(c[i])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment