0

I am working on creating a doubly linked circular list but am having a few problems. Here is my code:

#!/usr/bin/env python

class _DoublyLinkedList:

    class _Node(object):

        __slots__ = '_element', '_prev', '_next'

        def __init__(self, element, prev, next):
            self._element = element
            self._prev = prev
            self._next = next

        def getNext(self):
            return self._next

        def __str__(self):
            return str(self._element)

    def __init__(self):
        self._header = self._Node(None, None, None)
        self._trailer = self._Node(None, None, None)
        self._header._next = self._trailer
        self._trailer._prev = self._header
        self._size = 0

    def __len__(self):
        return self._size

    def is_empty(self):
        return self._size == 0

    def _insert_between(self, e, predecessor, successor):
        newest = self._Node(e, predecessor, successor)
        predecessor._next = newest
        successor._prev = newest
        self._size += 1
        return newest

    def _delete_node(self, node):
        predecessor = node._prev
        successor = node._next
        predecessor._next = successor
        successor._prev = predecessor
        self._size -= 1
        element = node._element
        node._prev = node._next = node._element = None
        return element

    def first(self): #return but do not remove the element at front
        if self.is_empty():
            raise Empty("Empty!")
        return self._header._next._element

    def last(self):
        if self.is_empty():
            raise Empty("Empty!")
        return self._trailer._prev._element

    def insert_first(self, e):
        self._insert_between(e, self._header, self._header._next)

    def insert_last(self, e):
        self._insert_between(e, self._trailer._prev, self._trailer)

    def delete_first(self):
        if self.is_empty():
            raise Empty("Empty!")
        return self._delete_node(self._header._next)

    def delete_last(self):
        if self.is_empty():
            raise Empty("Empty!")
        return self._delete_node(self._trailer._prev)

    def __str__(self):
        if self._size == 0:
            return '[]'
        retString = "["
        currentElement = self._header.getNext()
        for i in range(self._size):
            retString += str(currentElement) +", "
            currentElement = self._header.getNext()

        return retString[:-2] + ']'


def main():
    d = _DoublyLinkedList()
    d.insert_first(10)
    print(d.__str__())
    d.insert_last(23)
    d.insert_last(24)
    print(d.__str__())

if __name__ == "__main__":
    main()

For starters, as you can see this isn't circular at all so any pointers would help but what i am trying to figure out is why my output from this is:

[10]
[10, 10, 10]   

The program has the correct number of elements that I try to add but prints them all as the element that I inserted in the front and I don't understand why.

1 Answer 1

0

The reason is, each time through the loop, you get the same element.

currentElement = self._header.getNext()
for i in range(self._size):
    retString += str(currentElement) +", "
    currentElement = self._header.getNext()

Change this to:

currentElement = self._header.getNext()
for i in range(self._size):
    retString += str(currentElement) +", "
    currentElement = currentElement.getNext()
Sign up to request clarification or add additional context in comments.

1 Comment

Wow, okay thank you. Any tips on making this circular? @kindall

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.