Reversed double linked list by python

Question:

why can’t print reversed this double linked list by python?

always print 6 or None

please can anyone help me fast to pass this task

///////////////////////////////////////////////////////////////////////////

class Node:
    def __init__(self, data=None, next=None, prev=None):
            self.data = data
            self.next = next
            self.previous = prev

sample methods==>

    def set_data(self, newData):
        self.data = newData

    def get_data(self):
        return self.data

    def set_next(self, newNext):
        self.next = newNext

    def get_next(self):
        return self.next

    def hasNext(self):
        return self.next is not None

    def set_previous(self, newprev):
        self.previous = newprev

    def get_previous(self):
        return self.previous

    def hasPrevious(self):
        return self.previous is not None

class double===>

class DoubleLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def addAtStart(self, item):
        newNode = Node(item)
        if self.head is None:
            self.head = self.tail = newNode
        else:
            newNode.set_next(self.head)
            newNode.set_previous(None)
            self.head.set_previous(newNode)
            self.head = newNode

   
    def size(self):
        current = self.head
        count = 0
        while current is not None:
            count += 1
            current = current.get_next()
        return count

here is the wrong method ==>

try to fix it without more changes

def printReverse(self):
    current = self.head
    while current:
        temp = current.next
        current.next = current.previous
        current.previous = temp
        current = current.previous
    temp = self.head
    self.head = self.tail
    self.tail = temp
    print("Nodes of doubly linked list reversed: ")
    while current is not None:
        print(current.data),
        current = current.get_next()

call methods==>

new = DoubleLinkedList()
new.addAtStart(1)
new.addAtStart(2)
new.addAtStart(3)
new.printReverse()
Asked By: basel elazaly

||

Answers:

Your printReverse seems to do something else than what its name suggests. I would think that this function would just iterate the list nodes in reversed order and print the values, but it actually reverses the list, and doesn’t print the result because of a bug.

The error in your code is that the final loop has a condition that is guaranteed to be false. current is always None when it reaches that loop, so nothing gets printed there. This is easily fixed by initialising current just before the loop with:

 current = self.head

That fixes your issue, but it is not nice to have a function that both reverses the list, and prints it. It is better practice to separate these two tasks. The method that reverses the list could be named reverse. Then add another method that allows iteration of the values in the list. This is done by defining __iter__. The caller can then easily print the list with that iterator.

Here is how that looks:

    def reverse(self):
        current = self.head
        while current:
            current.previous, current.next = current.next, current.previous
            current = current.previous
        self.head, self.tail = self.tail, self.head

    def __iter__(self):
        node = self.head
        while node:
            yield node.data
            node = node.next

    def __repr__(self):
        return "->".join(map(repr, self))

The main program can then be:

lst = DoubleLinkedList()
lst.addAtStart(1)
lst.addAtStart(2)
lst.addAtStart(3)
print(lst)
lst.reverse()
print(lst)
Answered By: trincot
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.