В вашем коде есть несколько ошибок:
- Вставка в / до
head
на самом деле должна происходить в двух разных сценариях:
- Если список пуст,
head
становится node
- Если список не пустой, но
node
меньше первого элемента, head
также становится node
- В любом случае
node
ссылается на то, на что head
указывал раньше (null
или реальный узел), а head
теперь указывает на node
.
- Если вы не вставляете до
head
, тогда вы должны вставлять после какого-либо узла. Нам просто нужно найти, где это место. Есть два сценария:
node.getValue() > temp.getValue()
и node.getValue() < temp.getNext().getValue()
node.getValue() > temp.getValue()
и temp.getNext() == null
- В любом случае,
node
вставляется между temp
и temp.getNext()
Я предлагаю инкапсулировать после поиска точки вставки в своей собственной функции. То есть, учитывая список и значение, он должен возвращать узел. Если этот узел имеет то же значение, что и поисковое значение, просто увеличьте его; в противном случае вставьте после . В качестве особого случая, верните null
, чтобы указать, что точка вставки до head
.
В псевдокоде это будет выглядеть так:
FUNCTION findInsertionPoint(Node head, V value) RETURNS Node
// return null if value needs to be inserted before head
IF head == null OR value < head.getValue()
RETURN null;
// otherwise, either return a node with the given value,
// or return a node after which value should be inserted
Node curr = head;
REPEAT
IF curr.value == value
RETURN curr;
ELSEIF curr.getNext() == null OR curr.getNext().getValue() > value
RETURN curr;
ELSE
curr = curr.getNext();
PROCEDURE insert(V value) {
Node newNode = NEW Node(value);
Node insertPoint = findInsertionPoint(this.head, value);
IF insertPoint == null // insert before head
newNode.setNext(this.head);
this.head = newNode;
ELSE
IF insertPoint.getValue() == value
insertPoint.incrementCounter();
ELSE // insert after insertPoint
newNode.setNext(insertPoint.getNext());
insertPoint.setNext(newNode);
Обновление : я вижу, что вы перевели мой псевдокод на Java, но по какой-то причине вы пропустили коды, которые занимаются вставкой до head
, когда head
не пусто. В частности, вы необъяснимо пропустили эту часть:
IF head == null OR value < head.getValue()
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
и эта часть:
IF insertPoint == null
newNode.setNext(this.head); // <<<<<<<<<<<
this.head = newNode;
Оба они необходимы ; это то, что позволяет вставлять "A"
перед head
в [ "B", "C", "D" ]
.
Вам нужно понять, почему они важны, и действительно спросить себя, почему вы решили удалить их. Объясните нам, мне, себе, почему вы это сделали; осознать ошибку и извлечь из нее урок.