Вы на правильном пути.Прямо сейчас ваш код отлично работает для увеличения количества существующих элементов и добавления новых элементов.Вот как это выглядит в псевдокоде (я настоятельно рекомендую переименовать ваши previous
в current
и temp
в previous
, а затем перейдите к моему коду в соответствии с этим предположением - это будет намного проще рассуждать овставка и обход):
function KnapsackAdd(knapsack, item) {
if knapsack is empty {
make a new knapsack with one item in it
}
else { // there are already items in the knapsack
current = knapsack head
prev = null
while current != null {
if current->item == item {
current->count++
break
}
previous = current
current = current->next
}
// we're at the end of the list and didn't find the item
if current == null {
add new item to end of list
}
}
}
Как это можно изменить, чтобы добавить элементы, сохраняющие отсортированный порядок?Добавив еще одно сравнение во время обхода, мы можем проверить, больше ли текущий узел, чем число, которое мы хотим вставить.Если это так, мы знаем, что достигли правильной точки вставки:
function KnapsackAdd(knapsack, item) {
if knapsack is empty {
make a new knapsack with one item in it
}
else { // there are already items in the knapsack
current = knapsack head
prev = null
while current != null {
if current->item == item {
current->count++
break
}
else if current->item > item { // we're at the sorted insertion point!
make new_node(item: item, count: 1, next: current)
if prev != null { // we're inserting in the middle of the list
prev->next = new_node
}
else { // we're inserting at the beginning of the list
// so we need to update the head reference
set knapsack pointer to new_node
}
break
}
previous = current
current = current->next
}
// we're at the end of the list and didn't find the item
if current == null {
add new item to end of list
}
}
}
Давайте рассмотрим пример:
knapsack.add(5) // knapsack is [5]
knapsack.add(3) // when iterating, we see that 5 > 3 and engage the new code
// block. We must update the head. knapsack is now [3 -> 5]
knapsack.add(7) // knapsack is [3 -> 5 -> 7]. The new code block is not executed.
knapsack.add(6) // when iterating, we see that 7 > 6 and engage the
// new code block. No need to update the head; we use the
// previous element to link in the new 6 node.
// knapsack is [3 -> 5 -> 6 -> 7].
Надеюсь, этого достаточно, чтобы убедить вас, что если мы начнемс пустым списком и всегда вставкой с использованием этой схемы упорядочения, мы можем гарантировать упорядочение списка.
Сложность по времени такая же, как и раньше: O (n).