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:

# 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
# 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
# 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
# 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

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site