2014-12-30 2 views
3

Пример ввода: узел 'c' из связанного списка a-> b-> c-> d-> e Результат: ничего не возвращается, но новый связанный список выглядит как a-> b-> d-> eРеализовать алгоритм для удаления узла в середине одного связанного списка, учитывая только доступ к этому узлу

Я действительно понимаю, что ppl уже задал этот вопрос раньше, но поскольку моя репутация еще недостаточно высока, я не мог задать свой вопрос в этой теме. так вот мой quesetion: Таким образом, в растворе, при удалении среднего узла мы делаем:

public static boolean deleteNode(LinkedListNode n) { 
    if (n == null || n.next == null) { 
     return false; // Failure 
    } 
    LinkedListNode next = n.next; 
    n.data = next.data; 
    n.next = next.next; 
    return true; 
} 

Но то, что я не понимаю, что почему я не могу просто сделать п = дальше? Вероятно, это тривиальный вопрос, но я, кажется, не найти хорошее объяснение этого вопроса

ответ

1

В C++ код, который вы написали бы выглядеть следующим образом:

bool deleteNode(LinkedListNode* n) { 
    if (n == null || (*n).next == null) { 
     return false; // Failure 
    } 
    LinkedListNode* next = (*n).next; 
    (*n).data = (*next).data; 
    (*n).next = (*next).next; 
    return true; 
} 

Так что же это значит? При вызове этого метода в C++ это будет выглядеть следующим образом:

LinkedListNode* listNode = new LinkedListNode(); 
deleteNode(&listNode); 

Это важно, потому что это означает, что вы просто послать адрес более, а не весь объект. Это означает, что на самом деле у вас нет доступа к узлу, который вы указали в качестве параметра для метода, у вас есть только ссылка на его адрес.

В принципе, в Java, вы не можете сделать следующий C++ код:

*n = *next; 

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

В принципе, это потому, что в Java указатель класса передается по значению (в виде копии), а примитивы также передаются по значению (в виде копии).

+1

Его 'bool' в C++, а не 'boolean' тип данных, как указано в этом примере. Небольшая коррекция. – oya163

2

Если вы просто делаете n = next тогда вы только изменили какой объект местный ссылочную переменную n относится к; вы не изменили какую-либо часть списка.

Хитрость «удалить» текущий узел перезаписать его со следующим:

n.data = next.data; 
n.next = next.next; 

Теперь вы модифицирующие поля объекта, на который ссылается на n, который является частью фактический список.

0

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

LinkedListNode next = n.next; 
n.data = next.data; 
n.next = next.next; 

Вот как код приходит.

 Смежные вопросы

  • Нет связанных вопросов^_^