Search code examples
pythondoubly-linked-listdeque

Why does the latest "append" in my python doubly linked list have no effect?


This is part of my doubly linked list deque python code.

The 'appendleft' function written almost similar to the 'append' function is normally output. Why is the last 'append('apple')' code not output normally in the 'Group_of_append' function?

class Node:

    def __init__(self,item,prev,next):

        self.item = item
        self.prev = prev
        self.next = next

class deque:

    def __init__(self,name):

        self.name = name
        self.head = Node(None,None,None)
        self.tail = Node(None,self.head,None)

        self.head.next = self.tail
        self.size = 0

    def append(self,item):
        current = self.head
        new_node = Node(item,None,None)
        while current.next != None:
            current = current.next
        current.next = new_node
        new_node.prev = current
        self.tail = new_node
        self.size += 1
        return
    
    def appendleft(self,item):
        current = self.tail
        new_node = Node(item,None,None)
        while current.prev != None:
            current = current.prev
        current.prev = new_node
        new_node.next = current
        self.head = new_node
        self.size += 1
        return

    def print_list(self): 

        p = self.head

        while p.next != None:
            if p.item == None:
                pass
            else:
                print(p.item,end=' ')
            
            p = p.next

    def Group_of_append(self):
        print('Group_of_append')
        self.append('graphe')
        self.append('cherry')
        self.append('apple')
        self.appendleft('watermelon')
        self.appendleft('strawberry')
        self.print_list()
        print(" ")

deq = deque('name')
deq.Group_of_append()

the result is

strawberry watermelon graphe cherry

The last append code on Group_of_append, self.append('apple') have no effect.

While defining the 'append' function, I thought that there would be no output due to one more size being insufficient.

So, I changed 'append' function on deque like this

    def append(self,item):
        self.size += 1
        current = self.head
        new_node = Node(item,None,None)
        while current.next != None:
            current = current.next
        current.next = new_node
        new_node.prev = current
        self.tail = new_node
        self.size += 1
        return

But the result was same(still the lastest 'append' function doesn't print anything)

strawberry watermelon graphe cherry

Solution

  • Your appends work fine. Problem lies in your print_list function which stops when p.next is None. Which means your last element will not be printed because its next is None.

    All in all, your logic for this list is very strange and could use a lot of rework, it would make finding mistakes like this one a lot easier for you. For example, this iterating through the whole list when appending even though you have both head and tail readily available in the deque object.