Сбой моего кода из-за того, что я не установил значение головного узла?

#python #linked-list

#python #связанный список

Вопрос:

Итак, функция, с которой я работаю, — erase() [Удаляет узел или узлы в списке от первого до, но не включая последний: [первый, последний). Когда значение last не задано, удалите только первый узел]. Я успешно выполнил все тестовые примеры, за исключением случаев, когда мне нужно удалить головной узел. Конкретного узла нет.head или что-нибудь подобное в этом проекте, чтобы изменить его. И я почти уверен, что проблема связана с головным узлом.

(Извините за мой английский, это не мой родной язык, а также я впервые работаю со связанным списком)

Вот мой код:

 def erase(self, first: Node, last: Node = None) -> Node:
  #Case 3 (front)
    if first.prev is self.node and last is None:
        nxt = first.next
        nxt.prev = self.node
        first.next = self.node
        first.prev = self.node
        first = None

        return nxt.next
  

Самый простой пример таков:

0 <-> 2

и после запуска erase(lst.node.next) результат должен быть таким:

2

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

Комментарии:

1. Что такое в первом узле? prev

2. Нет <-> 0 <-> 2 <-> Нет <-> 0 <-> 2 <-> ….

3. Если я правильно читаю код, в первом узле ничего не произойдет, поскольку first.prev никогда не будет равно self.node

4. это так, то, что я пытаюсь сделать, это проверить первый узел, если он находится в начале списка first.prev — это self.узел должен сработать.

Ответ №1:

Если вы хотите удалить один узел, просто установите соседние ссылки на противоположного соседа.

 def erase(self, first: Node, last: Node = None) -> Node:
  #Case 3 (front)
    if last == None:  # remove first node only
       if first.next:
           first.next.prev = first.prev # link next to prev
       if first.prev:
           first.prev.next = first.next # link prev to next
       return first.next or first.prev  # return next node, else prev node