2016-08-16 5 views
-1

Это мой код. Я пытаюсь добавить новый узел в начале связанного списка. Но первый узел должен быть перезаписан. Итак, как мне добавить новый узел, не перезаписывая первый узел. образец выход: 10 15 20 Я пытаюсь добавить 5 в начале. Он приходит как: 5 15 20 Мне нужен выход следующим образом: 5 10 15 20.Добавить новый узел в начале связанного списка в python?

def push(self, new_data): 
    new_node = Node(new_data) 
    new_node.next = self.head 
    self.head = new_node 

llist.push(5) 

Это код в полном объеме:

class Node: 
    def init__(self, data): 
     self.data = data 
     self.next = None 

class Linkedlist: 
    def __init__(self): 
     self.head = None 
    def printlist(self): 
     temp = self.head 
     while(temp): 
      print temp.data, 
      temp = temp.next 
    def push(self, new_data): 
     new_node = Node(new_data) 
     ew_node.next = self.head 
     self.head = new_node 

if __name == 'main': 
    llist = Linkedlist() 
    llist.head = Node(10) 
    second = Node(15) 
    third = Node(20) 
    llist.push(5) 
    llist.head.next = second 
    second.next = third 
    llist.printlist() 
+0

'LLIST = 5 + llist'? –

+0

Я не могу с вами связаться – Dinesh

+0

Я не могу понять, что вы спрашиваете? – Dinesh

ответ

2

Проблема заключается в основной программе:

llist.head.next = second 

Это явно устанавливает голову списка, чтобы указать на второй элемент (значение 15), эффективно теряя предыдущий первый узел (10).

Но первый узел должен быть перезаписан.

Эта часть вашего вопроса неясна - ваш пример говорит об обратном. Если вы хотите, чтобы заменил предыдущим первым узлом, тогда все, что вам нужно сделать, это self.head = self.head.next, а затем нажмите, как и в __main__. Однако это не то, что показывает ваш пример.

Если с другой стороны, вы хотите на самом деле перезаписать Значение первого узла, вы могли бы сделать, например:

self.head.value = 99 

Так как я должен добавить новый узел без перезаписи первого узла ,

Ваш код для push выглядит правильно. Я предполагаю, что ваш self.head указывает на неправильный узел. Вот ваш код, встроенный в реализацию минималистического связанного списка, которая работает. Для сравнения я также добавление push_replace метод, который теряет первый элемент:

class Node(object): 
    def __init__(self, value): 
     self.value = value 
     self.next = None 

class List(object): 
    def __init__(self): 
     self.head = None 
    def push(self, new_data): 
     # this is your actual code 
     new_node = Node(new_data) 
     new_node.next = self.head 
     self.head = new_node 
    def push_replace(self, new_data): 
     # replace the previous first node 
     new_node = Node(new_data) 
     new_node.next = self.head.next 
     self.head = new_node 
    def __iter__(self): 
     node = self.head 
     while node: 
      yield node.value 
      node = node.next 

l = List() 
l.push(20) 
l.push(15) 
l.push(10) 
l.push(5) 
list(l) 
=> 
[5, 10, 15, 20] 
# now loose the first item 
l.push_replace(99) 
list(l) 
=> 
[99, 10, 15, 20] 

Примечание, как @FujiApple указал вам следует избегать изменения списка из-за пределов List кода. Другими словами, всегда выполняйте модификацию списка как новый метод. Это локализует знания о том, как работает список, и делает ваш код более стабильным и более легким для отладки.

0

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

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

class Linkedlist: 
    head = None 
    def __init__(self): 
     pass 
    def printlist(self): 
     temp = Linkedlist.head 
     while(temp): 
      print temp.data, 
      temp = temp.next 
    def push(self, new_data): 
     new_node = Node(new_data) 
     new_node.next = Linkedlist.head 
     Linkedlist.head = new_node 

if __name__ == '__main__': 
    llist = Linkedlist() 
    Linkedlist.head = Node(10) 
    second = Node(15) 
    third = Node(20) 
    #llist.push(5) 
    Linkedlist.head.next = second 
    second.next = third 
    llist.printlist() 
    llist.push(5) 
    print '' 
    llist.printlist() 

ВЫВОД:

10 15 20 
5 10 15 20 
Смежные вопросы