Я пытаюсь решить проблему связанного списка. Учитывая односвязанны список, изменить значение первой половины узлов, таких, что:вычитание узлов связанного списка
новое значение1-го узла = значение последнего узла - текущее значение первого узла
новое значение 2-го узла = значение второго последнего узла - второй текущее значение узла
Пример:
Учитывая связанный список 1 -> 2 -> 3 -> 4 -> 5,
Вы должны вернуть 4 -> 2 -> 3 -> 4 -> 5
До сих пор решения, которое я мог думать о
- итерирует LinkedList, чтобы найти длину.
- Итерировать вторую половину связанного списка, чтобы нажимать значения узлов в стек
- Итерировать первую половину списка, поместить стек, вычесть значения узлов.
Возможно, это самое наивное решение. Может ли annyone предложить более эффективное решение с точки зрения времени/пространства (хотите избежать нескольких итераций и дополнительного места для стека)? Заранее спасибо.
Ответ:
public ListNode subtract(ListNode a) {
ListNode slow =a;
ListNode fast=a;
ListNode head = a;
ListNode middle = null;
while(fast!=null && fast.next!=null)
{
if(fast.next.next!=null) // in case numOfNodes are even , we need to stay at middle
slow=slow.next;
fast = fast.next.next;
}
if(slow==fast)
return a;
middle = slow;
ListNode secondHalf = middle.next;
middle.next = null;
ListNode reversed = reverse(secondHalf);
ListNode temp1 = reversed;
while(temp1!=null){
head.val = temp1.val - head.val;
temp1 = temp1.next;
head = head.next;
}
middle.next = reverse(reversed);
return a;
}
public ListNode reverse(ListNode head){
ListNode current = head;
ListNode previous = null;
while(current!=null) {
ListNode temp = current.next;
current.next = previous;
previous = current;
current = temp;
}
return previous;
}
Должно ли это быть на определенном языке? Не могли бы вы использовать разные реализации List? – nickn
Вы можете иметь глобальную переменную, указывающую на начало и рекурсию до конца, и начать сравнивать конец с глобальной переменной и перемещать глобальную переменную вперед по мере продвижения, пока оба не станут равными. – thebenman
Он не должен быть на определенном языке ..... (хотя предпочтительнее Java). ... использование рекурсии вместе с глобальной переменной является интересным решением .. спасибо за предложение, что ... но каждый вызов recursion использует стек памяти для хранения аргументов ..... У меня есть ограничение для решения проблемы с использованием постоянного дополнительного пространства. ..... – KBR