2017-01-08 4 views
3

Я пытаюсь реализовать стек, используя связанный список, основанный только на классе узлов. У меня возникают некоторые проблемы с методом pop моего класса, который, похоже, не демонстрирует изменчивости. Когда я использую метод pop-класса, он возвращает вершину стека правильно, но не обновляет стек.Реализация стека с использованием связанного списка в python. Проблемы с методом pop и вопросы о изменчивости

x=stack_linked(1) 
x=x.insert(2) 
x=x.insert(3) 
x.print() # This is correct and prints 3,2,1 
print(x.pop()) # This is correct and prints 3, but doesn't actually modify my list 
x.print() # This prints 3,2,1 

Почему я не изменяю? Также как я могу изменить свой класс, не полностью взорвав его или создав для этого оболочку? Вот мой класс.

class stack_linked(object): 
    def __init__(self,data): 
    self.data=data 
    self.next=None 

    def insert(self,front): 
    front=stack_linked(front) 
    front.next=self 
    return front 

    def peek(self): 
    if self==None: 
     return None 
    else 
     return self.data 

    def pop(self): 
    front=self 
    self=self.next # some sort of issue here 
    return front 


    def print(self): 
    x=self 
    if x==None: 
     print("Empty") 
    else: 
     print(x.data) 
    while x.next !=None: 
     x=x.next 
     print(x.data) 
+1

Assigning to 'self' в методе экземпляра не приводит к замене всего экземпляра. – jonrsharpe

+0

Итак, как бы я переделал метод pop? – user3776598

+0

Также это проблема изменчивости? Или это не связано? – user3776598

ответ

2

Вы немного ограничены имея только узлы и вперед ссылки, но можно реализовать поп (-first), сделав первый узел вобрать в себя второй узел:

class stack_linked(object): 
    def __init__(self, data): 
     self.data = data 
     self.next = None 

    def pop(self): 
     data = self.data 
     nxt = self.next 
     if nxt is None: 
      self.data = self.next = None 
     else: 
      self.data = nxt.data 
      self.next = nxt.next 
      nxt.next = None 
     return data 
+0

Этот трюк работает! Спасибо! – user3776598

+0

Также зачем устанавливать 'nxt.next = None'? – user3776598

+0

'nxt.next = None', чтобы разбить любые циклы, чтобы сборщик мусора получал более легкое время. Семантически это также правильно, так как объект 'nxt' больше не существует и, следовательно, не должен указывать на живой объект. – thebjorn

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