2017-01-09 2 views
0
class _DoublyLinkedBase: 
    class _Node: 
     __slots__ ="_element", "_prev", "_next" 

     def __init__(self, element, prev, next): 
      self._element = element 
      self._prev = prev 
      self._next = next 
    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 

class LinkedDeque(_DoublyLinkedBase): 
    def first(self): 
     if self.is_empty(): 
      raise Empty("Deque is empty") 
     return self._header._next._element 


    def last(self): 
     if self.is_empty(): 
      raise Empty("Deque is 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("Deque is empty") 
     return self._delete_node(self._header._next) 

    def delete_last(self): 
     if self.is_empty(): 
      raise Empty("Deque is empty") 
     return self._delete._node(self._trailer._prev) 

Проблема заключается в том: , когда я попробовал это в Python:Почему я не могу получить значение узла в linkdeque в Python?

a = LinkedDeque() ## create a linked deque 
b = _DoublyLinkedBase._Node(5, None, None) ## create a node 
a.insert_first(b) ##put b in the first place 
a.first()  ##check the element 

Out[42]: <_DoublyLinkedBase._Node instance at 0x117660830> 

почему выход не 5?

+0

отступов на коде внесенных в списке проблем –

+0

Почему вы гнездование классы? Это делает ваш код излишне раздражающим для понимания и не дает вам никаких преимуществ ... –

+0

О, этот код был скопирован из книги Data Structures and Algorithms в Python. –

ответ

1

Ваш метод insert_first ожидает, что элемент будет передан, а не объект типа _Node (он обернет элемент в _Node сам по себе). Таким образом заменить ваш инициализируется b с:

b = 5 # Initialize an element. 
+0

Большое спасибо! Я забыл об этом... –

Смежные вопросы