Ich versuche dieses algorithmische Problem zu lösen, basierend auf der Datenstruktur der verknüpften Liste. Die Frage ist wie folgt:Partitionierung einer verketteten Liste
Gegeben eine verkettete Liste und ein Wert x, Partition es so, dass alle Knoten kleiner als x kommen vor Knoten größer als oder gleich x. Sie sollten die ursprüngliche relative Reihenfolge der Knoten in jeder der beiden Partitionen beibehalten.
Zum Beispiel
Gegeben 1-> 4> 3> 2> 5-> 2 und x = 3, return 1-> 2> 2> 4- > 3-> 5.
zum Problem Meine Lösung ist:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
if(head == null) return null;
ListNode headNode = new ListNode(-1);
headNode.next = head;
ListNode tail = head;
while(tail.next!=null){
tail = tail.next;
}
ListNode actualTail = tail;
ListNode current = headNode;
while(current!=actualTail && current.next!=actualTail){
if(current.next.val >= x && current.next!=tail){
System.out.println("Moving "+current.next.val+" to end of list, ahead of "+tail.val);
ListNode temp = current.next;
current.next = current.next.next;
tail.next = temp;
tail = tail.next;
tail.next = null;
}else{
current = current.next;
}
}
return headNode.next;
}
}
Während einige Testfälle arbeiten mit diesem Code wie der feinen oben erwähnt, gibt es eine Reihe von Testfällen, die in, dass ich nicht in der Lage ausfallen, bin um die ursprüngliche relative Reihenfolge der Knoten in der Liste beizubehalten.
Zum Beispiel: list = [1-> 2] x = 0
Mein Ergebnis: [2,1]
Erwartet: [1,2]
All Hilfe würde sehr geschätzt werden.
warum ist 4 in der linken Seite? – raven
Alle Knoten, die kleiner als x sind, kommen vor Knoten, die größer oder gleich x sind. Behalten Sie auch die ursprüngliche relative Reihenfolge bei. –