2016-06-30 3 views
0

У меня есть код ниже. Я пытаюсь удалить последний узел. Но узел не удаляется. temp все еще держит все data. Я не понял, что в Python назначение означает deep copy or shallow copy?Почему последний узел не удаляется Связанный список?

class ll: 
    def __init__(self, data): 
     self.data = data 
     self.next = None 
    def adddata(self, data): 
     if not self.next: 
      self.next = ll(data) 
      return 
     self.next.adddata(data) 
def display(root): 
    if root == None: 
     return 
    print root.data 
    display(root.next) 

def delete_last(root): 
    temp = root 
    myfrontptr = root.next 
    while myfrontptr.next != None: 
     root = root.next 
     myfrontptr = myfrontptr.next 
    if root.next != None and myfrontptr.next == None: 
     del myfrontptr 
    return temp 

l = ll(1) 
l.adddata(5) 
l.adddata(3) 
l.adddata(2) 
l.adddata(0) 
l.adddata(4) 
l = delete_last(l) 
display(l) 
+1

'del' не означает« удалить этот объект ». Это означает «отключить эту переменную». Вы отключите локальную переменную 'myfrontptr', но это ничего не делает для списка. – user2357112

+0

Это почти никогда не полезно для 'del' переменной. – user2357112

+0

Не связано с вашим вопросом, но кажется странным, что вы создаете старый класс стиля. В python 2.7 вам нужно объявить 'class ll (object)', если вы хотите (и вы это делаете, не так ли? !!) новые классы стиля –

ответ

2

Вместо использования del вы должны не учитывать последний узел.

Заменить

if root.next != None and myfrontptr.next == None: 
    del myfrontptr 

С

if root.next != None and myfrontptr.next == None: 
    root.next = None 
+0

'del' wont be helpful? Если да, то о 'myfrontptr' он все еще находится в памяти. Итак, 'Python' позаботится об этом самостоятельно? или нам нужно удалить его? –

+0

Сборщик мусора Python позаботится об этом. 'del' в основном используется, когда вы хотите удалить объект из списка или словаря. –

1

Вы забыли установить next ссылку на элемент перед тем последним элементом, когда последний элемент удаляется:

def delete_last(root): 
    temp = root 
    myfrontptr = root.next 
    while myfrontptr.next != None: 
     root = root.next 
     myfrontptr = myfrontptr.next 
    if root.next != None and myfrontptr.next == None: 
     del myfrontptr # you don't need this, myfrontptr is a local name anyway 
     root.next = None 
    return temp 

deldoes not remove anything from memory. Unline в C/C++, в python memory is freed by Garbage Collector. И даже в C/C++ вам придется перезаписать последний указатель/ссылку на элемент.

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