2013-12-03 3 views
2

Я пытаюсь узнать связанный список в разделе Использование питона,Как удалить данный узел из связанного списка с помощью Python

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

#!/usr/bin/python                                   

class Node(object): 
    def __init__(self, data=None, next=None): 
     self.data = data 
     self.next = next 
    def __str__(self): 
     return str(self.data) 

def print_list(node): 
    while node: 
     print node, 
     node = node.next 
    print 

def delete_node(node, node_to_remove): 
    if first_node == None: 
     return 
    pass 

# way of creating linked list 
def create_linked_list1(n): 
    linked_list = Node(1) 
    head = linked_list 
    for i in range(1, n): 
     head.next = Node(i) 
     head = head.next 
    return linked_list 

node1 = create_linked_list1(10) 

print_list(node1) 
+2

Пожалуйста, покажите нам свою связанную реализацию списка. Мы не можем показать функцию 'delete', которая работает с вашей реализацией, если мы не знаем, как вы ее реализовали. – abarnert

+0

Хорошо, я сделаю это. –

+0

Обновлено, пожалуйста, подтвердите его и любезно сообщите мне, как удалить данный узел –

ответ

4

Очевидное решение состоит в следующем:

def delete_by_index(node, index): 
    for _ in range(index): 
     prev_node, node = node, node.next 
    prev_node.next = node.next 

Однако, это не будет в состоянии удалить первый узел. Чтобы сделать это, вам нужно заставить его вернуть новую голову списка, которая обычно будет старой головой списка, но вместо этого будет старым вторым узлом в случае, когда вы удалили голову. Итак:

def delete_by_index(node, index): 
    if not index: 
     return node.next 
    head = node 
    for _ in range(index): 
     prev_node, node = node, node.next 
    prev_node.next = node.next 
    return head 

Должно быть очевидно, как это упростить, и вы должны это сделать.

Другой вариант заключается в том, чтобы разделить «поиск» и «удаление» частей. Напишите nth функцию (это должно быть легко), то вы можете сделать это:

def delete_by_index(node, index): 
    if not index: 
     return node.next 
    prev_node = nth(node, index-1) 
    prev_node.next = prev_node.next.next 
    return node 

Если вы знаете о рекурсивных функций, вы можете выяснить, как писать либо delete_by_index или nth рекурсивно (это один из самые простые рекурсивные функции для записи).

Вы также можете уловить ошибку, вызванную удалением, скажем, 15-го узла списка из 10 узлов и сделать его более приятным. Выясните, какая ошибка у вас будет получить в этом случае (или, если вы не можете понять это, просто запустите его и посмотрите), затем try/except, и вместо этого поднимите IndexError.

Пока вы на нем, вы можете добавить функцию delete_by_data(node, data) и, возможно, delete_by_identity(node, child_node) для дальнейшей практики.

+0

Спасибо, прочитав свой ответ, –

2

Предположим следующее одиночно список, связанный с указателем, head, к первому узлу

head ⇢ n0 → n1 → … → n i - 1 → n i → n i + 1 → … → n N-1 → None

def delete(i): 
    if i == 0:      # there is no prev node, increment head 
     head = head.next 
    else: 
     prev = get_node(i-1)  # find prev node, node[i-1] 
     prev.next = prev.next.next # remove node i 

Поскольку это односвязный список get_node(i-1) должны начаться в head и приращение i-1 раз, чтобы найти узел.

Примечание: Если бы это было вдвойне связанный список, учитывая node[i] вы можете найти node[i-1] с помощью node[i].prev.

+0

Вы имели в виду 'node (i-1) .next = node (i + 1)', правильно? – abarnert

+0

@abarnert yep спасибо! – bcorso

+0

Во всяком случае, это не распространяется на случай удаления узла 0. В реализации связанного списка с невидимым списком это всегда усложняет ситуацию. – abarnert

0

v-> w-> х> у> г, и если мы хотим удалить х, так что новый связанный список v -> w-> y-> г и мы имеем доступ только х

положение следующего узла к й т.е. положения узла Y

next_node = x.next

перекачки Y в X, а затем удаление Y `x.data = next_node.data

x.next = next_data.next

0

Удаление узла с использованием python в одном списке.

Защиту удалить (самостоятельно, данные):

if self.head.data==data: 

     temp=self.head.next 
     del self.head 
     self.head=temp 

    else: 


     p=self.head 
     while p.next.data!=data: 
      p=p.next 

     temp=p.next.next 
     del p.next 
     p.next=temp 
Смежные вопросы