#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