Удалить узел из односвязного списка простым способом

#python #linked-list

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

Вопрос:

Я изучаю LinkedList из простой проблемы с leetcode Удалить узел в связанном списке — LeetCode

Напишите функцию для удаления узла (кроме хвоста) в односвязном списке, учитывая доступ только к этому узлу.

Данный связанный список — head = [4,5,1,9], который выглядит следующим образом:

введите описание изображения здесь

Пример 1:

 Input: head = [4,5,1,9], node = 5
Output: [4,1,9]
Explanation: You are given the second node with value 5, the linked list should become 4 -> 1 -> 9 after calling your function.
  

Пример 2:

 Input: head = [4,5,1,9], node = 1
Output: [4,5,9]
Explanation: You are given the third node with value 1, the linked list should become 4 -> 5 -> 9 after calling your function.
  

Примечание:

  • Связанный список будет содержать как минимум два элемента.
  • Все значения узлов будут уникальными.
  • Данный узел не будет хвостом, и он всегда будет допустимым узлом связанного списка.
  • Не возвращайте ничего из своей функции.

И официальное решение:

Замените значение узла, который вы хотите удалить, значением в следующем за ним узле, а затем удалите узел после него.

 # Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

   class Solution:
        def deleteNode(self, node):
            """
            :type node: ListNode
            :rtype: void Do not return anything, modify node in-place instead.
            """
            node.val = node.next.val 
            node.next = node.next.next 
  

Я подумал, что это громоздко, поэтому изменил его на:

 class Solution:
    def deleteNode(self, node):
        node= node.next
  

Назначить следующий узел текущему узлу простым способом

К сожалению, он сообщает о неправильном ответе.

Я не могу понять, почему это не работает.

Логика не содержит ошибок: текущий узел был затенен его следующим узлом,

Ответ №1:

Вот что мы хотим сделать, удалить node :

pre -> node -> post => pre -> post

Итак, что вам нужно сделать, это изменить pre.next с node на node.next . Нравится:

pre.next = node.next

Если вы это сделаете node = node.next , это только изменит node ссылку.

Это никак не влияет на исходный ListNode.

Но мы не можем попасть pre в этот сценарий, поэтому нам нужно изменить node значение, чтобы стать на post , и удалить post .

Надеюсь, это поможет вам, и прокомментируйте, если у вас возникнут дополнительные вопросы. 🙂

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

1. Я понял. узел — это объект. невозможно сделать что-то вроде [1, 2, 3] = [3, 4, 5] , потому что обе стороны являются объектами, а не переменными.