При наличии связанного списка чисел в неубывающем порядке, за исключением одного элемента, найдите один неуместный элемент.
Я чувствую, что для этого должен быть простой алгоритм, но я не могу понять это.Вы не можете просто сравнить текущее число с последним, потому что у вас есть такие случаи, как 1, 2, 5, 3, 5, где 3 будет неверно возвращен как элемент «не на месте».
Это мой код:
Node* fix(Node* head) {
if (!head || !head->next) return head;
Node* curr = head;
Node* prev = head;
Node* wrongNode = head;
Node* wrongPrev = head;
while (curr) {
if ((!curr->next && prev->val > curr->val) || //if at beginning or end, its outofplace
(curr == head && curr->val > curr->next->val)) {
wrongNode = curr;
wrongPrev = prev;
break;
}
if (curr->next && ((prev->val < curr->val && curr->next->val < curr->val) ||
(prev->val > curr->val && curr->next->val > curr->val))) { // if both sides of element are either larger or smaller, it might be outofplace. Check by running through the list to see if list is in correct order if you skip the element.
wrongNode = curr;
wrongPrev = prev;
Node* temp = head;
Node* tempPrev = head;
while (temp && tempPrev->val <= temp->val) {
tempPrev = temp;
if (temp->next == curr) temp = temp->next->next;
else temp = temp->next;
}
if (!temp) break;
}
prev = curr;
curr = curr->next;
}
if (wrongNode == head) head = wrongNode->next;
else wrongPrev->next = wrongNode->next;
curr = head, prev = head;
while (curr && wrongNode->val > curr->val) {
prev = curr;
curr = curr->next;
}
if (curr == head) head = wrongNode;
else prev->next = wrongNode;
wrongNode->next = curr;
return head;
}
Я в основном сканирую список, и если я нахожу элемент в начале, который больше, чем следующий, или элемент в конце, который меньше, чембольше, чем предыдущий, этот элемент должен быть элементом смещения.
Если это не так, я ищу элемент k, который имеет элемент до и после, так что они оба либо большечем к или оба меньше его.Затем я пытаюсь проверить, находится ли список в неубывающем порядке без k.Если это так, то k неуместно.Если нет, то это должно быть следующим (я думаю).
Затем я вставляю k в нужное место.
Возможные входные данные, такие как
1, 0, где 1или 0 не к месту.
1, 2, 5, 6, 4, 7, где 4 не к месту.
1, 2, 5, 3, 4, к которому 5of place.
7, 1, 2, где 7 не к месту.
Должен быть более простой способ сделать это.Я просто не вижу этого.