Ich versuche, eine verknüpfte Liste Problem zu lösen. Bei einer einfach verknüpften Liste, ändern Sie den Wert der ersten Halb Knoten, so dass:Subtrahieren der verknüpften Liste Knoten
ersten Knotens neuen Wert = der Wert des letzten Knoten - erste Stromwert des Knotens
zweiten Knotens neuen Wert = der zweiten letzten Knotens Wert - 2. Knoten aktuelle Wert
Beispiel:
Bei verketteten Liste 1 -> 2 -> 3 -> 4 -> 5,
Sie kehren sollen 4 -> 2 -> 3 -> 4 -> 5
Bisher Lösung, die ich denken konnte, ist
- Iterate der LinkedList die Länge zu finden.
- Iterieren Sie die zweite Hälfte der verketteten Liste, um die Knotenwerte in einen Stapel zu schieben
- Iterieren Sie die erste Hälfte der Liste, pop den Stapel, subtrahieren Sie die Knotenwerte.
Wahrscheinlich ist dies die naivste Lösung. Kann annyone bitte vorschlagen eine effizientere Lösung in Bezug auf Zeit/Raum (mehrere Wiederholungen und zusätzlichen Platz für Stapel vermeiden wollen)? Danke im Voraus.
Antwort:
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;
}
Muss dies in einer bestimmten Sprache sein? Könnten Sie verschiedene List-Implementierungen verwenden? – nickn
Sie könnten eine globale Variable haben, die auf den Anfang und die Rekursion bis zum Ende zeigt und das Ende mit der globalen Variable vergleicht und die globale Variable vorwärts bewegt, während Sie fortfahren, bis beide gleich werden. – thebenman
Es muss nicht in einer bestimmten Sprache sein ..... (obwohl Java bevorzugt wird). ... die Rekursion zusammen mit der globalen Variable zu verwenden, ist eine interessante Lösung ... Danke, dass ... aber jeder Rekursionsaufruf Stack-Speicher zum Speichern der Argumente verwendet ..... Ich habe eine Einschränkung, um das Problem mit konstantem zusätzlichen Platz zu lösen. ..... – KBR