List Reversal Lists are fun The task for this lab is to cre
# List Reversal
Lists are fun. The task for this lab is to create a reversal function for LinkedList class. Example:
L = LinkedList() for i in range(3):
L.add(i)
# 2 -> 1 -> 0
L.reverse()
# 0 -> 1 -> 2
Generator
In python, you can create a generator for your class.
def __iter__(self):
cur = self._head
while cur:
yield cur.data
cur = cur.next
To use it...
L = LinkedList()
for i in range(3):
L.add(i)
for i in L:
print(i)
# 2
# 1
# 0
# To-Dos
Add the generator to LinkedList class Implement the reverse function In the reverse function, you should only use constant space
. Do not use other data structures (e.g. stack) than linkedlist.
Do not create another linkedlist object and load all data again.
Hint
Start from the simplest case. Think about how to reverse a list
import unittest
from LinkedList import LinkedList
class TestLinkedList(unittest.TestCase):
def setUp(self):
self.L = LinkedList()
def addNodes(self,num):
for i in range(num):
self.L.add(i)
def recreateListwithLength(self,length):
self.L = LinkedList()
self.addNodes(length)
def getList(self):
return [i for i in self.L]
def testIter(self):
self.recreateListwithLength(1)
self.assertEqual(self.getList(),[0])
self.assertEqual(self.L.getHead(),0)
self.assertEqual(self.L.getTail(),0)
self.recreateListwithLength(2)
self.assertEqual(self.getList(),[1,0])
self.assertEqual(self.L.getHead(),1)
self.assertEqual(self.L.getTail(),0)
self.recreateListwithLength(5)
self.assertEqual(self.getList(),[4,3,2,1,0])
self.assertEqual(self.L.getHead(),4)
self.assertEqual(self.L.getTail(),0)
def testEmptyList(self):
self.recreateListwithLength(0)
self.assertEqual(self.getList(),[])
self.L.reverse()
self.assertEqual(self.getList(),[])
self.L.reverse()
self.assertEqual(self.getList(),[])
def testReverse(self,length=1):
self.recreateListwithLength(length)
self.assertEqual(self.getList(),[i for i in reversed(range(length))])
self.assertEqual(self.L.getHead(),length-1)
self.assertEqual(self.L.getTail(),0)
self.L.reverse()
self.assertEqual(self.getList(),[i for i in range(length)])
self.assertEqual(self.L.getHead(),0)
self.assertEqual(self.L.getTail(),length-1)
self.L.reverse()
self.assertEqual(self.getList(),[i for i in reversed(range(length))])
self.assertEqual(self.L.getHead(),length-1)
self.assertEqual(self.L.getTail(),0)
def testVariedLength(self):
self.testReverse(1)
self.testReverse(2)
self.testReverse(9)
self.testReverse(1000)
if __name__ == \'__main__\':
unittest.main()
class LinkedList:
def __init__(self):
self._head = None
self._tail = None
self._length = 0
def add(self, item):
\"\"\" add something in front of the head\"\"\"
self._head = ListNode(item, self._head)
if self._tail is None:
self._tail = self._head
self._length += 1
def getHead(self):
return self._head.data
def getTail(self):
return self._tail.data
def reverse(self):
pass
def __len__(self):
pass
def __iter__(self):
pass
class ListNode:
def __init__(self, data,link=None):
self.data = data
self.next = link
Solution
Here is the Solution:
class LinkedList:
def __init__(self):
self._head = None
self._tail = None
self._length = 0
def add(self, item):
\"\"\" add something in front of the head\"\"\"
self._head = ListNode(item, self._head)
if self._tail is None:
self._tail = self._head
self._length += 1
def getHead(self):
return self._head.data
def getTail(self):
return self._tail.data
def reverse(self):
prev = None
current = self._head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
self._head = prev
def __len__(self):
return self._length
def __iter__(self):
cur = self._head
while cur:
yield cur.data
cur = cur.next
def printList(self):
temp = self._head
while(temp):
print (temp.data,)
temp = temp.next
class ListNode:
def __init__(self, data,link=None):
self.data = data
self.next = link
l1=LinkedList()
l1.add(10)
l1.add(20)
l1.add(30)
l1.add(40)
print(\"Display all linked list\")
print(l1.printList())
print(\"Display head of linked list\")
print (l1.getHead())
print(\"Display tail of LinkedList\")
print(l1.getTail())
print(\"Display Length\");
print(l1.__len__())
print(\"reversing Linked List\")
l1.reverse()
print(\"Display all linked list\")
print(l1.printList())
print(\"Display head of linked list\")
print (l1.getHead())
print(\"Display tail of LinkedList\")
print(l1.getTail())
print(\"Display Length\");
print(l1.__len__())
output:



