class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
def __str__(self):
return str(self.value)
class LinkedList:
def __init__(self, *items):
self.head = None
self.tail = None
self.add(*items)
def add(self, *items):
for item in items:
self.addAtEnd(item)
def addAtEnd(self, value):
if not self.head:
self.head = self.tail = Node(value)
else:
curr = self.head
while curr.next:
curr = curr.next
curr.next = Node(value)
self.tail = curr.next
def elems(self):
curr = self.head
count = 0
while curr:
count += 1
curr = curr.next
return count
def __str__(self):
curr = self.head
res = []
while curr:
res.append(str(curr.value))
curr = curr.next
return "->".join(res)
def removeValue(lst: LinkedList, value):
# take care of values-to-be-removed at front.
while lst.head.value == value:
lst.head = lst.head.next
# take care of values-to-be-removed after front.
curr = lst.head
prev = None
while curr:
if curr.value == value:
curr = curr.next
if prev:
prev.next = curr
else:
prev = curr
curr = curr.next
return lst
tests = [
((1,2,3), 3, '1->2'),
((1, 2, 3,3,3,3), 3, '1->2'),
((8,1,1,4,12), 1, '8->4->12'),
((7,12,2,9), 7, '12->2->9'),
((7,7,7,12,2,9), 7, '12->2->9'),
]
for i, (a, value, expected) in enumerate(tests):
l = LinkedList(*a)
got = str(removeValue(l, value))
if got == expected:
print(f"PASS")
else:
print(f"FAIL: expected '{expected}', got '{got}'")