Это довольно простой вопрос, но я запутался:Удаление элемента из связанного списка с ограничениями
Учитывая односвязанны список, написать функцию, чтобы удалить данный узел.
1) Он должен принимать указатель на узел запуска в качестве первого параметра и узла, подлежащего удалению, в качестве второго параметра, то есть указатель на головной узел не является глобальным. 2) Он не должен возвращать указатель на головной узел. 3) Он не должен принимать указатель на указатель на головной узел.
Решение в Java заключается в следующем:
void deleteNode(Node node, Node n) {
if (node == n) {
if (node.next == null) {
System.out.println("There is only one node. The list "
+ "can't be made empty ");
return;
}
node.data = node.next.data;
n = node.next;
node.next = node.next.next;
System.gc();
return;
}
// When not first node, follow the normal deletion process
// find the previous node
Node prev = node;
while (prev.next != null && prev.next != n) {
prev = prev.next;
}
if (prev.next == null) {
System.out.println("Given node is not present in Linked List");
return;
}
prev.next = prev.next.next;
System.gc();
return;
}
Я смущен о том, почему при удалении узла головы, мы не изменяя указатель головы, но копировать поля вместо (изменения содержания), но при удалении других узлов это просто prev.next = prev.next.next
Это работает, если мы просто делаем head = head.next
вместо удаления головного узла?
Спасибо!
Большое спасибо! Я вижу, поскольку голова не может быть передана как глобальный указатель, поэтому изменение локальной переменной ничего не делает. Я думаю, что другая проблема с кодом - это система.дс(). Я чувствую, что это не очень необходимо, и одна и та же логика в C намного лучше, чем на Java. Можете ли вы указать, какой типичный подход для удаления узлов? – AngieCris
Также я смущен тем, что для удаления головы нам нужно переместить все содержимое рядом с головой, но при удалении узла в середине будет работать только «prev.next = prev.next.next». – AngieCris
@AngieCris ok Я отвечу на оба эти вопроса в тексте – sprinter